windows下互斥量的使用

来源:互联网 发布:sql查询语句实例 编辑:程序博客网 时间:2024/05/18 21:49
互斥量:
适用范围:可以跨进程同步,还可以用来保证程序只有一个实例运行(创建命名互斥量),也可以用来做线程间的同步
相关结构: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;
}
0 0