白话windows多线程同步之互斥变量

    引子介绍了事件和信号量内核对象,他们可以保证多个线程在一个时刻只访问一个变量,也可以让多个线程同时访问一个变量,只需要设置相关参数即可。有没有在任何时候都能保证只有一个独占一个资源呢?有!互斥变量。

他的使用步骤大致如下:

hMutext = CreateMutex() ;主线程创建一个互斥变量

   ThrdFun1()//线程1

{

WaitForSingleObject(hMutext )

//do something

ReleaseMutex(hMutext )

}


  ThrdFun2()//线程2

{

WaitForSingleObject(hMutext )

//do something

ReleaseMutex(hMutext )

}

这样就可以保证每个线程的访问是互斥的。但是互斥变量有他的特殊性,与其他内核对象不同,这是因为他具有“线程所有权”。呵呵,很专业术语对不对,还有WaitForSingleObject(hMutext)什么时候会返回呢?是不是没有介绍清楚,不急,这就来解释。

互斥量对象除了包含使用计数(任何内核对象都有)外,还包含线程ID和一个递归计数。创建互斥变量的函数CreateMutex()第二个参数是个bool值,设为TRUE,表明创建的互斥变量的线程ID为该调用线程,否则线程ID为0.

当互斥变量线程ID为0时,WaitForSingleObject就可以返回,并将互斥变量的线程ID设为该调用线程的ID,这样其他线程就不能获得他,只能等待。

那等待到什么时候呢?

当之前获得互斥变量的线程调用ReleaseMutex(hMutext)就好了。

注意一定要保证是之前获取了互斥变量的那个线程去调用,否则会失败。可以看出互斥量的“线程所有权”了吧。

最后一点,如果在主线程中创建互斥变量时给他了线程ID,即第二个参数为TRUE,那么调用

WaitForSingleObject(hMutext)会获得该互斥变量吗?(⊙o⊙)应该不会吧,上面不是说当互斥变量线程ID为0时,

WaitForSingleObject就可以返回吗!错了,嘻嘻,会的。这又是一条互斥变量的规则:

当想要获得互斥变量的线程ID与互斥变量内部记录的线程ID相等时,系统会让线程保持可调度状态。

不过这个时候,要想让其它线程再次获得该互斥变量,必须调用ReleaseMutex两次,聪明的朋友,你们肯定也想到了吧。

展开阅读全文

没有更多推荐了,返回首页