您的位置:首页 > 其它

利用内核对象同步线程

2009-04-09 11:29 357 查看
内核对象可用于不同进程间线程的同步。

1.Wait系列函数

WaitForSingleObject

挂起当前线程,直到该函数返回。(被等待的对象处于Signal状态或等待超时)

若有多个线程调用该函数等待同一个内核对象,那么当这个内核对象处于Signal状态时只有一个线程会被唤醒。

若线程中有创建Windows的代码,需要用MsgWaitForMultipleObjects代替WaitForSingleObject,否则会产生死锁。

WaitForMultipleObjects

若需要同时等待多个内核对象,则可以调用该函数

2.事件内核对象

自动事件

当事件处于Signal状态时,只有一个等待该事件的线程会被唤醒。 之后事件会被自动回到Non Signal状态。

手动事件

当事件处于Signal状态时,所有等待该事件的线程都会被唤醒。 之后需要调用ResetEvent把Event对象调回到Non Signal状态。

3.信号量对象

信号量可以控制可以时运行的线程的数量。

在创建信号量对象时要用一个初值来初始化lMaximumCount(允许运行线程数目的最大值),并把lInitialCount的值赋给CurrentSource

信号量内部用CurrentSource来记录当前可运行线程的数量,。

当CurrentSource大于0时,信号量处于Signal状态。当CurrentSource=0时

当CurrentSource=0时,信号量处于Non Signal状态。

WaitForSingleObject会使CurrentSource减1, ReleaseSemaphore会使CurrentSource+1.

4.互斥锁

WAIT_ABANDONED

在Windows中使用互斥锁可以有效的避免死锁。

当持有Mutex的线程在调用ReleaseMutex前意外退出,如ExitThread和TerminateThread。系统会把Mutex分给等待Mutex的线程中的一个并返回Wait_Abandoned,从而避免了死锁。

5. 其它同步方法

Asynchronous Device I/O

WaitForInputIdle

MsgWaitForMultipleObjects(Ex)

WaitForDebugEvent

SignalObjectAndWait

Detecting Deadlocks with the Wait Chain Traversal API

6.Common API:

WaitForSingleObject WaitForMultipleObjects

MsgWaitForMultipleObjects

CreateEvent CreateEventEx SetEvent ResetEvent OpenEvent

CreateSemaphore OpenSemaphore

CreateMutex OpenMutex ReleaseMutex
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: