用内核对象进行线程同步1

来源:互联网 发布:pl sql块包括哪几部分 编辑:程序博客网 时间:2024/05/22 03:14
1、进程内核对象在创建的时候总是处于未触发状态。当进程终止时系统会自动使进程内核对象变成触发状态。
2、线程内核对象也遵循上面的规则。
3、等待函数使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。常用的为WaitForSingleObject。
4、WaitForMultipleObjects允许调用线程同时检查多个内核对象的触发状态。
    WaitForMultipleObjects能够以原子方式执行所有操作,如果你希望,它可以返回触发它的线程是某一个
    或某几个。
5、事件内核对象包含一个使用计数,一个用来表示事件是自动重置事件还是手动重置事件的布尔值,另一个用
    来表示事件有没有触发的布尔值。
6、事件的触发表示一个操作已经完成。有两种不同类型的事件对象:手动重置事件和自动重置事件。当一个手动重置事件
    被触发的时候,正在等待该事件的所有线程都将变成可调度状态。而当一个自动重置事件被触发的时候,只有一个
    正在等待该事件的线程会变成可调度状态。
7、事件最通常的用途是,让一个线程执行初始化工作,然后再触发一个线程,让它执行剩余的工作。一开始我们将事件初始化
    为未触发的状态,然后当线程完成初始化工作的时候,触发事件。此时,另一个线程一直在等待该事件,它发现事件被触发,
    于是变成可调度状态。第二个线程知道第一个线程完成了它的工作。
8、CreateEvent(PSECURITY_ATTRIBUTES psa,BOOL bManualReset,BOOL bInitialState,PCTSTR pszName);
    用来创建一个事件内核对象。bManualReset是指是否为手工重置事件,bInitialState事件是否初始化为触发状态。
    返回一个事件内核对象句柄,与当前的进程相关联。
9、SetEvent把事件变为触发状态,ResetEvent把事件变为未触发状态。
10、创建可等待的计时器,HANDLE CreateWaitableTimer(PSECURITY_ATTRIBUTES psa,BOOL bManualReset,PCTSTR pszName);
    得到一个可等待的计时器的句柄,HANDLE OpenWaitableTimer(DWORD dwDesiredAccess,BOOL bInheritHandle,PCTSTR pszName);
    bManualReset是手动重置还是自动重置,手动时,正地等待的所有计时器都会变成可调度;自动时,只有一个等待的变为可调度的。
11、创建的计时器总是处于未触发状态,可通过SetWaitableTimer来触发。SetWaitableTimer传入的是全球标准时间。
    CancelWaitableTimer计时器取消
12、Windows开发人员可能会比较可等待计时器和用户计时器(通过SetTimer函数来设置),两者最大的区别在于用户计时器需要在
    应用程序中使用大量的用户界面基础设施,从而消耗更多的资源。可等待计时器是内核对象,
    这意味着它们不仅可以在多线程间共享,可以具备安全性。

原创粉丝点击