#include <iostream>
#include <cstdlib>
#include <Windows.h>
using namespace std;
int tickets = 100;
HANDLE hMutex;
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (true)
{
WaitForSingleObject(hMutex, INFINITE); //请求互斥量访问权
if (tickets > 0)
{
Sleep(10);
cout << "Thread 1 sell ticket : "<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);//释放
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while (true)
{
WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
Sleep(10);
cout << "Thread 2 sell ticket : "<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
//创建两个线程,线程之间通过创建的互斥量来互斥
int main()
{
/*
第一个参数同样是安全结构,默认是NULL不能继承句柄;第二个参数为FALSE时创建Mutex时不指定所有权,
若为TRUE则指定为当前的创建线程ID为所有者,其他线程访问需要先ReleaseMutex;第三个参数用于设置Mutex名,
为NULL时表示是匿名互斥量
*/
hMutex = CreateMutex(NULL, FALSE, NULL);
/*
-1-第一个参数是安全属性结构,主要控制该线程句柄是否可为进程的子进程继承使用,默认使用NULL时表示不能继承;若想继承线程句柄,则需要设置该结构体,将结构体的bInheritHandle成员初始化为TRUE;
-2-cbStack表示的线程初始栈的大小,若使用0则表示采用默认大小初始化;
-3-lpStartAddr表示线程开始的位置,即线程要执行的函数代码,这点有点类似于回调函数的使用;
-4-lpvThreadParam用来接收线程过程函数的参数,不需要时可以设置为NULL;
-5-fdwCreate表示创建线程时的标志,CREATE_SUSPENDED表示线程创建后挂起暂不执行,必须调用ResumeThread才可以执行,0表示线程创建之后立即执行
-6-lpIDThread用来保存线程的ID;
*/
HANDLE hThread_1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);//创建线程1
HANDLE hThread_2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);//创建线程2
CloseHandle(hThread_1);
CloseHandle(hThread_2);
system("pause");
return 0;
}
原文链接
http://blog.chinaunix.net/uid-26275986-id-3886498.html