线程同步技术二:Mutex的使用

1.产生互斥器的函数是

 HANDLE CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,  
  BOOL bInitialOwner,                       
  LPCTSTR lpName                           
);

 

第一个参数默认为NULL,第二个参数为TRUE的时候表示调用CreateMutex的线程拥有了这个线程核心对象,第三个参数表示互斥器的名称

 

2.要获得Mutex的拥有权,应该调用响应的Wait函数,如:WaitForSingleObject,要解除与Mutex的拥有关系, 应该调用ReleaseMutex;

 

要关闭一个Mutex应该调用CloseHandle函数.

 

3.下面以一个简单的win32模拟售票的程序来说明互斥器的使用, 具体的见注释

 

 

 

#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data ); DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data ); int index=0; int tickets=100; HANDLE hMutex; void main() { HANDLE hThread1; HANDLE hThread2; hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); hMutex=CreateMutex(NULL, FALSE,"tickets");//创建一个Mutex,不被主线程拥有 //判断Mutex是否已经被创建了 if(hMutex) { if(ERROR_ALREADY_EXISTS==GetLastError()) { cout<<"only one instance can run!"<<endl; return; } } Sleep(4000); //使主线程睡眠4秒 } DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data ) { while(TRUE) { WaitForSingleObject(hMutex,INFINITE);//获得Mutex的使用权 if(tickets>0) { Sleep(1); //睡眠1ms,使线程2执行 cout<<"thread1 sell ticket : "<<tickets--<<endl; } else break; ReleaseMutex(hMutex); //解除与Mutex的拥有关系 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data ) { while(TRUE) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) { Sleep(1); cout<<"thread2 sell ticket : "<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } return 0; }

 

 

 

线程1和线程2通过不断的拥有Mutex和解除关系来实行同步售票.

 

 

 

你可能感兴趣的:(thread,null,fun,attributes,winapi)