mutex 与 WaitForSingleObject

来源:互联网 发布:杜汶泽现状2017 知乎 编辑:程序博客网 时间:2024/05/18 07:52

WaitForSingleObject的函数原型为:

WINBASEAPIDWORDWINAPIWaitForSingleObject(    __in HANDLE hHandle,          __in DWORD dwMilliseconds     );

参数说明:

    hHandle: 对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。

   dwMilliseconds: 定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。

本文主要介绍mutex对象。

HANDLE hMutex; hMutex = CreateMutex(NULL, FALSE, NULL); 
CreateMutex()函数的第二个参数是FALSE,表示刚刚创建的这个Mutex不属于任何线程,也就是没有任何线程拥有他,一个Mutex在没有任何线程拥有他的时候,他是处于激发态的,所以处于有信号状态。

调用ReleaseMutex()是把互斥量变为有信号。

下面是一个实例:

// winthread.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Windows.h>#include <iostream>using namespace std;#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse  = FALSE;LONG g_lCounter = 0;DWORD ThreadProc(void *pData){int ThreadNumberTemp = (*(int*)pData);HANDLE hMutex;if ((hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL ){cout << "Open Mutex error!" << endl;}WaitForSingleObject(hMutex, INFINITE);cout << "ThreadProc: " << ThreadNumberTemp << " is running!" << endl;cout << "ThreadProc: " << ThreadNumberTemp << " gets the mutex" << endl;ReleaseMutex(hMutex);CloseHandle(hMutex);return 0;}int _tmain(int argc, _TCHAR* argv[]){int i;DWORD ID[THREAD_INSTANCE_NUMBER];HANDLE h[THREAD_INSTANCE_NUMBER];HANDLE hMutex;if ( (hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL ){if ( (hMutex = CreateMutex(NULL, FALSE, "Mutex.Test")) == NULL ){cout << "Create Mutex error!" << endl;return 0;}}for (i = 0; i < THREAD_INSTANCE_NUMBER; i++){WaitForSingleObject(hMutex, INFINITE);h[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (void *)&ID[i], 0, &(ID[i]));if (h[i] == NULL)cout << "CreateThread error" << ID[i] << " " << i << endl;elsecout << "CreateThread: " << ID[i] << " " << i << endl;ReleaseMutex(hMutex);}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER, h, TRUE, INFINITE);cout << "Close the Mutex Handle!" << endl;CloseHandle(hMutex);system("pause");return 0;}
其中的一个运行结果如下:





原创粉丝点击