您的位置:首页 > 其它

线程同步的三种方法(互斥,事件,临界区) 之二 使用互斥对象

2007-12-12 10:16 447 查看

#include <windows.h>


#include <iostream>


using namespace std;


DWORD WINAPI Fun1Proc(LPVOID lpParameter);


DWORD WINAPI Fun2Proc(LPVOID lpParameter);




int index =0;


int tickets=100;


HANDLE hMutex;


void main()


{


HANDLE hThread1;


HANDLE hThread2;


//创建线程


hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);


hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);


CloseHandle(hThread1);


CloseHandle(hThread2);


//**************************************************************


//保证应用程序只有一个实例运行,创建一个命名的互斥对象.


hMutex=CreateMutex(NULL,TRUE,LPCWSTR("tickets"));


//创建时主线程拥有该互斥对象,互斥对象的线程ID为主线程的ID,同时将该互斥对象内部计数器置为1


if (hMutex)


{


if (ERROR_ALREADY_EXISTS==GetLastError())


{


cout<<"only one instance can run!"<<endl;


//Sleep(40000);


return;


}


}


//**************************************************************


WaitForSingleObject(hMutex,INFINITE);


//使用该函数请求互斥对象时,虽说该对象处于无信号状态,但因为请求的线程ID和该互斥对象所有者的线程ID是相同的.


//所以仍然可以请求到这个互斥对象,于是该互斥对象内部计数器加1,内部计数器的值为2.


ReleaseMutex(hMutex);//释放一次互斥对象,该互斥对象内部计数器的值递减1,操作系统不会将这个互斥对象变为已通知状态.


ReleaseMutex(hMutex);//释放一次互斥对象,该互斥对象内部计数器的值为0,同时将该对象设置为已通知状态.


//对于互斥对象来说,谁拥有谁释放


Sleep(40000);


}




DWORD WINAPI Fun1Proc(LPVOID lpParameter)


{


while (TRUE)


{


WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号


if (tickets>0)


{


Sleep(1);


cout<<"thread1 sell ticket :"<<tickets--<<endl;


}


else


break;


ReleaseMutex(hMutex);//设置该互斥对象的线程ID为0,并且将该对象设置为有信号状态


}


return 0;


}




DWORD WINAPI Fun2Proc(LPVOID lpParameter)


{


while (TRUE)


{


WaitForSingleObject(hMutex,INFINITE);


if (tickets>0)


{


Sleep(1);


cout<<"thread2 sell ticket :"<<tickets--<<endl;


}


else


break;


ReleaseMutex(hMutex);


}


return 0;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: