利用内核对象同步线程
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
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
相关文章推荐
- 利用内核对象同步线程
- Delphi驱动开发研究之内核同步对象—线程与定时器
- Windows编程--线程和内核对象的同步-信标(信号量)内核对象
- Windows核心编程<读书笔记九>线程与内核对象的同步
- 线程与内核对象的同步
- 利用事件对象同步线程
- 第9章 线程与内核对象的同步
- Windows核心编程 第九章 线程与内核对象的同步(上)
- Windows编程-- 线程和内核对象的同步 - 互斥对象内核对象
- 线程与内核对象的同步
- Windows编程-- 线程和内核对象的同步 - 互斥对象内核对象
- 孙鑫VC学习笔记:第十六讲 (一) 利用事件对象实现线程间的同步
- Windows编程那些事----线程与内核对象同步之【信标对象】
- Windows编程--线程和内核对象的同步-事件内核对象
- 线程与内核对象的同步小结
- 孙鑫VC学习笔记:第十六讲 利用事件对象实现线程间的同步
- 第九章 线程与内核对象的同步(1)
- 线程与内核对象的同步
- windows核心编程读书笔记7——内核态线程同步(2)利用内核对象同步
- Windows核心编程 第九章 线程与内核对象的同步(下)