互斥量:
适用范围:可以跨进程同步,还可以用来保证程序只有一个实例运行(创建命名互斥量),也可以用来做线程间的同步
相关结构:HANDLE hMutex;
相关方法:
/*
创建互斥量,初始化的工作
参数一为安全选项,一般为空
参数二表示当前互斥量是否属于某个线程,一般为空
参数三互斥量的名称,如果需要跨进程同步或者需要保证程序只有一个实例运行,则需要设置,其他情况一般为空。
*/
CreateMutex(NULL,FALSE,NULL)
WaitForSingleObject(hMutex,INIFINET);//同事件对象
/*
释放互斥量,以使得其他线程可以访问。
*/
ReleaseMutex(hMutex)
/*
在互斥对象通知引 起调用等待函数返回时,等待函数的返回值不再是通常的WAIT_OBJECT_0(对于WaitForSingleObject()函数)或是在 WAIT_OBJECT_0到WAIT_OBJECT_0+nCount-1之间的一个值(对于WaitForMultipleObjects()函 数),而是将返回一个WAIT_ABANDONED_0(对于WaitForSingleObject()函数)或是在WAIT_ABANDONED_0 到WAIT_ABANDONED_0+nCount-1之间的一个值(对于WaitForMultipleObjects()函数)。
*/
WaitForMultiObjects(DWORD nCount, // 等待句柄数
CONST HANDLE *lpHandles, // 句柄数组首地址
BOOL fWaitAll, // 等待标志
DWORD dwMilliseconds // 等待时间间隔)
/*
打开一个已经创建好了的命名互斥量,用于跨进程同步
*/
HANDLE OpenMutex(
DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 继承标志
LPCTSTR lpName // 互斥对象名
);
测试代码:
#include <stdio.h>
#include <Windows.h>
#include <Mmsystem.h>
#pragma comment(lib, "Winmm.lib")
int thread_count = 0;
HANDLE hMutex;
DWORD CALLBACK thread_proc(LPVOID params)
{
int i = 0;
char c = 'A';
for(i = 0; i < 10; ++i)
{
WaitForSingleObject(hMutex,INFINITE);
for(c = 'A'; c <= 'Z'; ++c)
{
printf("%c",c);
Sleep(1);
}
printf("\n");
ReleaseMutex(hMutex);
}
thread_count--;
return 0;
}
int main()
{
hMutex = CreateMutex(NULL,FALSE,NULL);
thread_count = 4;
CreateThread(0, 0, thread_proc, 0, 0, 0);
CreateThread(0, 0, thread_proc, 0, 0, 0);
CreateThread(0, 0, thread_proc, 0, 0, 0);
CreateThread(0, 0, thread_proc, 0, 0, 0);
while (thread_count)
Sleep(0);
getchar();
return 0;
}