1、利用互斥对象实现线程同步
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int index = 0;
int tickets = 100;
HANDLE hMutex; //全局互斥对象句柄
void main()
{
HANDLE hThread1;
HANDLE hThread2;
DWORD dwThreadID1; //线程ID
DWORD dwThreadID2;
hThread1 =CreateThread(NULL,0,Fun1Proc,NULL,0,&dwThreadID1);
hThread2 =CreateThread(NULL,0,Fun2Proc,NULL,0,&dwThreadID2);
CloseHandle(hThread1);
CloseHandle(hThread2);
hMutex = CreateMutex(NULL,false,NULL); //创建互斥对象,第二个参数为false,表示该线程不拥有此互斥对象。第三个参数,表示创建匿名的互斥对象。
Sleep(4000); //让主线程放弃执行,不退出。进入等待状态,不占用CPU。
return;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex,INFINITE);//请求互斥对象。
if (tickets > 0)
{
Sleep(1);
cout<<"thread1 sell tickets:"<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex,INFINITE);//请求互斥对象。
if (tickets > 0)
{
Sleep(1);
cout<<"thread2 sell tickets:"<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
2、互斥对象:mutex,确保多个线程对单个资源的互斥访问。
3、WaitForSingleObject返回的条件:(1)hMutex变成有信号状态。(2)第二个参数表示超时时间。0表示立即返回.INFINITE表示会一直等,只到等到有信号。还可以设置个等待时间。
4、释放互斥对象: ReleaseMutex()。如果线程终止了,但是没有释放,则操作系统会将互斥对象的引用计数置为0.这样其他请求该互斥对象的线程就可以获得该互斥对象了。可以通过返回值来判断是怎么获得该互斥对象的。
5、此程序在双核CPU上会有问题,关闭一个核心后就OK了。关闭核心的方法:点击“开始”菜单→运行→输入 msconfig 打开“系统配置实用程序” 选择 BOOT.INI 选项卡→点击“高级选项”按钮
/NUMPROC(N)= 这个前面打钩 后面的选择1,然后点“确定”保存 重启电脑即可
单核,只有一个线程在执行,双核,同时可以有两个线程执行。
6、命名互斥对象:hMutex = CreateMutex(NULL,false,“tickets”); 可以通过GetLastError(),来保证只有一个实例运行。