首页 > 代码库 > Windows线程同步

Windows线程同步

说到windows线程同步的方法,有循环锁,临界区(关键代码段),内核对象(Event,Semaphore,Mutex).甚至进程,线程handle等等。

说说用法:

  临界区和mutex都可以用于控制共享资源的互斥访问,不同点是 临界区是用户级对象,消耗小,速度快,但是不能跨进程。mutex是内核对象速度慢,但是可以跨进程。

  semaphore可以用来进行资源控制,信号量的两个关键参数,现有资源数和最大资源数,可以用于对资源的控制,通过ReleaseSemaphore对资源增加,WaitFor*函数对资源减小。

  Event可以用于通知,event的状态可以手动改变,用于通知所有等待线程(manual reset event)或者单个线程(auto reset event)是否运行。

 

说说注意点:

  Mutex是有线程属性的,Mutex内核对象中有线程ID,如果ID=0,则为已通知状态,WaitFor*函数返回,ID被设为获取的线程ID,ReleaseMutex之后ID又被设为0,其他线程就有机会获取mutex。如果线程没有ReleaseMutex异常退出,则mutex也会释放,ID被设为0,其他线程则有机会获得mutex。

  Event有两种用法,一种是自动重置,一种是手动重置。自动重置会在WaitFor*获取到event之后重置为未通知,这样只有一个等待线程(WaitFor*)会返回。手动重置则会一直等到ResetEvent才会重置为未通知状态,所以所有等待线程(WaitFor*)都会返回。

  Semaphore可以控制同时运行的线程数量,最大资源数确定了最多同时运行的线程数,现有资源数确定现在可以运行的线程数。(WaitFor*)减少资源,ReleaseSemaphore增加资源数,资源总数不超过最大资源数。

Windows线程同步