window下线程同步之(Mutex(互斥器) )

使用方法: 
1、创建一个互斥器:CreateMutex; 
2、打开一个已经存在的互斥器:OpenMutex; 
3、获得互斥器的拥有权:WaitForSingleObject、WaitForMultipleObjects 等一类等待的函数……(可能造成阻塞); 
4、释放互斥器的拥有权:ReleaseMutex; 
5、关闭互斥器:CloseHandle;

函数原型:

HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BOOL bInitialOwner, __in_opt LPCTSTR lpName );
1
2
3
4
5
6
7
8
9
lpMutexAttributes : 第一个参数表示安全控制,一般直接传入NULL。
 
bInitialOwner第二个参数用来确定互斥量的初始拥有者。
 
       如果传入TRUE表示互斥量对象内部会记录创建它的线程的线程ID号并将递归计数设置为1,由于该线程ID非零,所以互斥量处于未触发状态,表示互斥量为创建线程拥有。 
 
如果传入FALSE,那么互斥量对象内部的线程ID号将设置为NULL,递归计数设置为0,这意味互斥量不为任何线程占用,处于触发状态。
 
lpName第三个参数用来设置互斥量的名称,在多个进程中的线程就是通过名称来确保它们访问的是同一个互斥量。

※ 命名标准:Mutex 可以跨进程使用,所以其名称对整个系统而言是全局的,所以命名不要过于普通,类似:Mutex、Object 等。 
最好想一些独一无二的名字等!

固有特点(优点+缺点): 
1、是一个系统核心对象,所以有安全描述指针,用完了要 CloseHandle 关闭句柄,这些是内核对象的共同特征; 
2、因为是核心对象,所以执行速度会比 Critical Sections 慢几乎100倍的时间(当然只是相比较而言); 
3、因为是核心对象,而且可以命名,所以可以跨进程使用; 
4、Mutex 使用正确的情况下不会发生死锁; 
5、在“等待”一个 Mutex 的时候,可以指定“结束等待”的时间长度; 
6、可以检测到当前拥有互斥器所有权的线程是否已经退出!Wait……函数会返回:WAIT_ABANDONED

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <windows.h>
using  namespace  std;
 
HANDLE   g_hMutex = NULL;
const  int  g_Number = 3;
DWORD  WINAPI ThreadProc1(__in   LPVOID  lpParameter);
DWORD  WINAPI ThreadProc2(__in   LPVOID  lpParameter);
DWORD  WINAPI ThreadProc3(__in   LPVOID  lpParameter);
 
int  main()
{
     g_hMutex = CreateMutex(NULL,FALSE,NULL);
     //TRUE代表主线程拥有互斥对象 但是主线程没有释放该对象  互斥对象谁拥有 谁释放 
     // FLASE代表当前没有线程拥有这个互斥对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
     HANDLE  hThread[ g_Number ] = {0};
     int  first = 1, second = 2, third = 3;
     hThread[ 0 ] = CreateThread(NULL,0,ThreadProc1,( LPVOID )first,0,NULL);
     hThread[ 1 ] = CreateThread(NULL,0,ThreadProc2,( LPVOID )second,0,NULL);
     hThread[ 2 ] = CreateThread(NULL,0,ThreadProc3,( LPVOID )third,0,NULL);
 
     WaitForMultipleObjects(g_Number,hThread,TRUE,INFINITE);
     CloseHandle( hThread[0] );
     CloseHandle( hThread[1] );
     CloseHandle( hThread[2] );
 
     CloseHandle( g_hMutex );
     return  0;
}
 
DWORD  WINAPI ThreadProc1(__in   LPVOID  lpParameter)
{
     WaitForSingleObject(g_hMutex, INFINITE); //等待互斥量
     cout<<( int )lpParameter<<endl;
     ReleaseMutex(g_hMutex); //释放互斥量
     return  0;
}
 
DWORD  WINAPI ThreadProc2(__in   LPVOID  lpParameter)
{
     WaitForSingleObject(g_hMutex, INFINITE); //等待互斥量
     cout<<( int  )lpParameter<<endl;
     ReleaseMutex(g_hMutex); //释放互斥量
     return  0;
}
 
DWORD  WINAPI ThreadProc3(__in   LPVOID  lpParameter)
{
     WaitForSingleObject( g_hMutex, INFINITE); //等待互斥量
     cout<<( int )lpParameter<<endl;
     ReleaseMutex(g_hMutex); //释放互斥量
     return  0;
}

 http://www.cnblogs.com/staring-hxs/p/3664765.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值