内核模式之互斥量

转载自:http://blog.csdn.net/morewindows/article/details/7470936

步骤:

  1、CreateMutex,创建互斥量

  2、用WaitForSingleObject,获得互斥量

  3、ReleaseMutex,当用完互斥量后,就释放。其实就是将其内核记录的线程ID变为0

对互斥量的个人理解:

  1、互斥量与临界区的功能是一样的。

  2、互斥量是一个内核对象,因为是一个内核对象,所以能被更多的线程、进程所共享

  3、互斥量能够很好地处理“遗弃”问题,避免让其它线程、进程,进入“忙等”状态。

  4、临界区只是一个用户模式下的同步对象。

  5、互斥量与临界区一样都是拥有线程权,即创建同步对象的线程,可以忽略同步对象的存在而执行,所以这两个同步对象,都只适合互斥操作,而不适合同步。(互斥是一种特殊的同步)

代码:

//经典线程同步问题 互斥量Mutex
#include <stdio.h>
#include <process.h>
#include <windows.h>

long g_nNum;
unsigned int __stdcall Fun(void *pPM);
const int THREAD_NUM = 10;
//互斥量与关键段
HANDLE  g_hThreadParameter;
CRITICAL_SECTION g_csThreadCode;

int main()
{
	printf("     经典线程同步 互斥量Mutex
");
	printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --

");
	
	//初始化互斥量与关键段 第二个参数为TRUE表示互斥量为创建线程所有
	g_hThreadParameter = CreateMutex(NULL, FALSE, NULL);
	InitializeCriticalSection(&g_csThreadCode);

	HANDLE  handle[THREAD_NUM];	
	g_nNum = 0;	
	int i = 0;
	while (i < THREAD_NUM) 
	{
		handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
		WaitForSingleObject(g_hThreadParameter, INFINITE); //等待互斥量被触发
		i++;
	}
	WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
	
	//销毁互斥量和关键段
	CloseHandle(g_hThreadParameter);
	DeleteCriticalSection(&g_csThreadCode);
	for (i = 0; i < THREAD_NUM; i++)
		CloseHandle(handle[i]);
	return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
	int nThreadNum = *(int *)pPM;
	ReleaseMutex(g_hThreadParameter);//触发互斥量
	
	Sleep(50);//some work should to do

	EnterCriticalSection(&g_csThreadCode);
	g_nNum++;
	Sleep(0);//some work should to do
	printf("线程编号为%d  全局资源值为%d
", nThreadNum, g_nNum);
	LeaveCriticalSection(&g_csThreadCode);
	return 0;
}

 结果:

原文地址:https://www.cnblogs.com/wang-can/p/3334741.html