CreateMutex 和 WaitForSingleObject互斥对象

转自: http://blog.sina.com.cn/s/blog_6cbbf04b0100wijd.html


#include <windows.h>

#include <iostream>

using namespace std;

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<<"thread1 sell 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<<"thread2 sell 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
                 ReleaseMutex(hMutex);                                 // -1
由于上述例子中,waitforsingleobject是放在主线程上,所以线程Fun1Proc和Fun2Proc必须要在主线程的计数器为0的时候才能申请到“位置”,若不为零,不可以轮到1,2执行。
图书馆登记和注销 要求:有一阅览室,读者进入时必须先在一张登记表上登记。该表中每个表项代表阅览室中的一个座位。读者离开时要消掉其登记信息。阅览室共有50 个座位。登记表每次仅允许一位读者进行登记或注销。 本实验由两个进程组成,分别是登陆和注销进程 使用到的函数和信号量 HANDLE mutex; HANDLE empty; HANDLE full; 创建信号量 HANDLE CreateSemaphore( __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// lpSemaphoreAttributes是信号量的安全属性 可为NULL __in LONG lInitialCount,// lInitialCount是初始化的信号量 __in LONG lMaximumCount,// lMaximumCount是允许信号量增加到最大值 __in_opt LPCWSTR lpName//lpName是信号量的名称 可为NULL ); 创建互斥信号量 HANDLE CreateMutex(  LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 可为NULL  BOOL bInitialOwner, // 初始化互斥对象的所有者  LPCTSTR lpName // 指向互斥对象名的指针 ); 申请一个资源 WaitForSingleObject(HANDLE full,INFINITE); 释放资源 ReleaseSemaphore( __in HANDLE hSemaphore,// hSemaphore是要增加的信号量句柄 __in LONG lReleaseCount,// lReleaseCount是增加的计数。 __out_opt LPLONG lpPreviousCount//lpPreviousCount是增加前的数值返回。 ); 释放互斥信号量 BOOL ReleaseMutex(HANDLE hMutex); DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in array CONST HANDLE *lpHandles, // object-handle array BOOL bWaitAll, // wait option DWORD dwMilliseconds // time-out interval );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值