本文共 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可以通过一个命名的互斥对象ahuang1900来实现,只有一个实例在运行。#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!"<
转载地址:http://hfpti.baihongyu.com/