CreateMutex和WaitForSingleObject互斥对象 createmutex进程互斥

#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;

hMutex=CreateMutex(NULL,TRUE,NULL);//FALSE意思为没有被占用,有信号状态 +1
WaitForSingleObject(hMutex,INFINITE);// +1
ReleaseMutex(hMutex);// -1
ReleaseMutex(hMutex);// -1

hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(4000);
}


DWORD WINAPI Fun1Proc(
LPVOID lpParameter
)
{
while(TRUE)
{

WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
{
Sleep(1);//放弃执行权利另一个线程运行
cout<<"thread1sell the ticket:"<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}


DWORD WINAPI Fun2Proc(
LPVOID lpParameter
)
{
while(TRUE)
{

WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
{
Sleep(1);
cout<<"thread2sell the ticket:"<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}

//////////////////

关于WaitForSingleObject(hMutex,INFINITE);内部会有一个计数器,根据申请或者释放自行加减1
hMutex=CreateMutex(NULL,TRUE,NULL);若设置为TRUE,申请同时就被主线程占用。

hMutex=CreateMutex(NULL,FALSE,NULL);若设置为FALSE,则申请后不被占用。

上文例子中的计数器加减情况如下。

hMutex=CreateMutex(NULL,TRUE,NULL);//FALSE意思为没有被占用,有信号状态+1
WaitForSingleObject(hMutex,INFINITE);// +1
ReleaseMutex(hMutex);// -1
CreateMutex和WaitForSingleObject互斥对象 createmutex进程互斥
ReleaseMutex(hMutex);// -1
由于上述例子中,waitforsingleobject是放在主线程上,所以线程Fun1Proc和Fun2Proc必须要在主线程的计数器为0的时候才能申请到“位置”,若不为零,不可以轮到1,2执行。

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/120655.html

更多阅读

Win7系统进程和服务优化 win7系统进程优化工具

Win7系统进程和服务优化——简介Win7系统已经取代XP系统成为如今最主流的系统,但大多数用户的系统配置并不高,运行Win7时显得很乏力,这时我们就需要考虑如何让Win7运行起来更高效、更快,同时又要保证系统的稳定运行。Win7系统进程

转载 《其实我是爱你的》读后感 挫折其实没什么读后感

艾米老师的这本《其实我是爱你的》是一本写给婚恋男女的真爱圣经原文地址:《其实我是爱你的》读后感作者:Young《其实我是爱你的》读后感  ——爱的能力和爱的对象   作者:asalways   读完《其实我是爱你的》,在皆大欢喜的结

面向对象的特征有哪些方面 equals和==的区别

面向对象的特征有哪些方面计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程。——面向对象编程就是模拟这样一系列的过程。面向对象是按现实业务一样的方式将程序代码按一个个对象

ExcelVBA教程:如何引用单元格和区域

ExcelVBA教程:如何引用单元格和区域使用 Visual Basic的普通任务是指定单元格或单元格区域,然后对该单元格或单元格区域进行一些操作,如输入公式或更改格式。通常用一条语句就能完成操作,该语句可标识单元格,还可更改某个属性或应用某个

声明:《CreateMutex和WaitForSingleObject互斥对象 createmutex进程互斥》为网友我是呀分享!如侵犯到您的合法权益请联系我们删除