博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MultiThread(4)-Mutex
阅读量:4149 次
发布时间:2019-05-25

本文共 2624 字,大约阅读时间需要 8 分钟。

#include 
#include
using namespace std;DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data);DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data);int index=0;int tickets=100;HANDLE hMutex;void main(){ HANDLE hThread1; HANDLE hThread2; //创建互斥对象 hMutex = CreateMutex(NULL,TRUE,NULL); //第二个参数为TRUE,主线程拥有互斥对象 //创建线程 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); WaitForSingleObject(hMutex,INFINITE); //操作系统判断当前请求的互斥对象的线程的ID是否与互斥对象当前拥有的线程ID, //如果相等,即使该互斥对象处于为通知状态,调用线程仍能获得其所有权。 //对于同一个线程多次拥有的互斥对象来说,该互斥对象内部的计数器记录了该线程拥有的次数。 ReleaseMutex(hMutex); //互斥对象内部维护的计数器减1 ReleaseMutex(hMutex); Sleep(4000);}DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data){ while(TRUE) { WaitForSingleObject(hMutex,INFINITE); //等待hMultex处于有信号状态 if(tickets>0) { Sleep(1); cout<<"thread1 sell ticket : "<
<
0) { Sleep(1); cout<<"thread2 sell ticket : "<
<

代码改变为:

#include 
#include
using namespace std;DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data);DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data);int index=0;int tickets=100;HANDLE hMutex;void main(){ HANDLE hThread1; HANDLE hThread2; //创建互斥对象 hMutex = CreateMutex(NULL,TRUE,NULL); //第二个参数为TRUE,主线程拥有互斥对象 //创建线程 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); WaitForSingleObject(hMutex,INFINITE); //操作系统判断当前请求的互斥对象的线程的ID是否与互斥对象当前拥有的线程ID, //如果相等,即使该互斥对象处于为通知状态,调用线程仍能获得其所有权。 //对于同一个线程多次拥有的互斥对象来说,该互斥对象内部的计数器记录了该线程拥有的次数。 ReleaseMutex(hMutex); //互斥对象内部维护的计数器减1 ReleaseMutex(hMutex); Sleep(4000);}DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data){ WaitForSingleObject(hMutex,INFINITE); //等待hMultex处于有信号状态 cout<<"thread1 sell ticket : "<
<

在运行程序时,操作系统维护了线程的信息以及该线程相关的互斥对象的信息,因此它知道哪个线程终止了。假如某个线程得到了所需互斥对象的所有权,完成其线程代码的运行,但是没有释放该互斥对象的所有权就退出之后,操作系统一旦发现该线程已经终止,它就会自动将该线程所拥有的互斥对象的线程ID设为0,并将其计数器归0.

#include 
#include
using namespace std;DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data);DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data);int index=0;int tickets=100;HANDLE hMutex;void main(){ HANDLE hThread1; HANDLE hThread2; //创建互斥对象 hMutex = CreateMutex(NULL,TRUE,"ahuang1900"); //第二个参数为TRUE,主线程拥有互斥对象;第三个参数为ahuang1900,表示命名互斥对象 if (hMutex) { if(ERROR_ALREADY_EXISTS==GetLastError()) { cout <<"Ony one instance can run!"<
可以通过一个命名的互斥对象ahuang1900来实现,只有一个实例在运行。

转载地址:http://hfpti.baihongyu.com/

你可能感兴趣的文章
流形学习-高维数据的降维与可视化
查看>>
Python-OpenCV人脸检测(代码)
查看>>
python+opencv之视频人脸识别
查看>>
人脸识别(OpenCV+Python)
查看>>
6个强大的AngularJS扩展应用
查看>>
网站用户登录系统设计——jsGen实现版
查看>>
第三方SDK:讯飞语音听写
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
自定义控件:飞入飞出的效果
查看>>
自定义控件:动态获取控件的高
查看>>
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>
第三方SDK:百度地图SDK的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>
JavaScript setTimeout() clearTimeout() 方法
查看>>
CSS border 属性及用border画各种图形
查看>>
转载知乎-前端汇总资源
查看>>
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>