• 内核模式之互斥量


    转载自: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;
    }
    

     结果:

  • 相关阅读:
    Socket编程实现客户端与服务器一对一聊天
    HttpClient获取页面信息与Jsoup封装获取
    代码推送
    re正则
    MySQL 的主从复制
    关于前后端的缓存
    session/cookie/token
    如何保证缓存(redis)与数据库(MySQL)的一致性
    进程与线程(程序与任务)
    QA/QC
  • 原文地址:https://www.cnblogs.com/wang-can/p/3334741.html
Copyright © 2020-2023  润新知