C++多线程同步(采用互斥对象Mutex)
// Mutex.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI Proc1(LPVOID lpParameter);//线程1的入口函数
DWORD WINAPI Proc2(LPVOID lpParameter);//线程2的入口函数
int ticket = 100;
HANDLE hMutex;//全局互斥对象
void main()
{
HANDLE hthread1;
HANDLE hthread2;
//创建线程
hthread1 = CreateThread(NULL,0,Proc1,NULL,0,NULL);
hthread2 = CreateThread(NULL,0,Proc2,NULL,0,NULL);
CloseHandle(hthread1);//并没有终止线程的运行;当不再需要线程句柄时,应将其关闭,让这个线程内核对象的引用计数减1
CloseHandle(hthread2);
//创建互斥对象
hMutex = CreateMutex(NULL,FALSE,NULL);
//保证应用程序只有一个实例
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == GetLastError())
{
cout<<"只有一个实例可以运行!"<<endl;
return;
}
}
WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
ReleaseMutex(hMutex);
Sleep(4000);//主线程静默4秒
}
DWORD WINAPI Proc1(
LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
Sleep(1);
if (ticket > 0)
cout<<"thread1 sell ticket: "<<ticket--<<endl;
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI Proc2(
LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
Sleep(1);
if (ticket > 0)
cout<<"thread2 sell ticket: "<<ticket--<<endl;
else
break;
ReleaseMutex(hMutex);
}
return 0;
}