多线程火车票售票系统——互斥对象实现线程同步

来源:互联网 发布:centos查看uuid 编辑:程序博客网 时间:2024/05/05 15:42

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(),来保证只有一个实例运行。

原创粉丝点击