白话windows多线程同步之互斥变量
2014-05-27 00:13
120 查看
引子:介绍了事件和信号量内核对象,他们可以保证多个线程在一个时刻只访问一个变量,也可以让多个线程同时访问一个变量,只需要设置相关参数即可。有没有在任何时候都能保证只有一个独占一个资源呢?有!互斥变量。
他的使用步骤大致如下:
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两次,聪明的朋友,你们肯定也想到了吧。
他的使用步骤大致如下:
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两次,聪明的朋友,你们肯定也想到了吧。
相关文章推荐
- windows平台的多线程同步互斥:从内核源码分析----小话多线程(3)
- 总结windows多线程同步互斥
- Windows下C++多线程同步与互斥简单运用
- Windows下C++多线程同步与互斥简单运用
- linux系统中多线程同步之互斥变量、读写锁、条件变量
- Windows下C++多线程同步与互斥简单运用(转)
- Windows下C++多线程同步与互斥简单…
- 白话windows多线程同步之关键段
- 白话windows多线程同步之可等待计时器内核对象
- C++11多线程同步之互斥变量使用学习
- windows下多线程同步及互斥代码,并且加入了守卫(自动锁)
- windows多线程同步互斥--总结
- 白话windows多线程同步之信号量
- Windows下C++多线程同步与互斥简单运用
- Windows多线程同步系列之一-----互斥对象
- Windows下C++多线程同步与互斥简单运用-转
- 白话windows多线程同步之事件对象
- Windows下C++多线程同步与互斥简单运用
- delphi 多线程同步 互斥变量,信号量,事件对象。http://www.bianceng.cn/Programming/Delphi/200912/12689.htm
- windows多线程同步互斥--总结