C 執行緒同步互斥量Mutex

2021-08-17 10:27:27 字數 2233 閱讀 1238

一、互斥物件

互斥物件屬於系統核心物件,它能夠使執行緒擁有對某個資源的絕對訪問權。互斥物件主要包含使用數量、執行緒id、遞迴計數器等。執行緒id表示當前擁有互斥物件的執行緒,遞迴計數器表示執行緒擁有互斥物件的次數。

1、當互斥物件的執行緒id為0時,表示互斥物件不被任何執行緒所擁有,此時系統會發出該互斥物件的通知訊號,等待該互斥物件的其他執行緒中的某乙個執行緒會擁有該互斥物件,同時,互斥物件的執行緒id為當前擁有該互斥物件的執行緒的執行緒id。

2、當互斥物件的執行緒id不為0時,表示當前有執行緒擁有該互斥物件。系統不會發出互斥物件的通知訊號。其他等待互斥物件的執行緒繼續等待,直到擁有改互斥物件的執行緒釋放互斥物件的擁有權。

二、建立互斥物件

createmutex函式建立乙個互斥物件,成功返回該互斥物件的控制代碼,失敗返回null。

handle winapi createmutex(

__in lpsecurity_attributes lpmutexattributes,//互斥物件的安全屬性

__in bool binitialowner,//互斥物件的初始狀態;true表示互斥物件的執行緒id為當前排程執行緒的執行緒id,當前建立互斥物件的執行緒具有他的擁有權,互斥物件的遞迴計數器為1

__in lpctstr lpname//互斥物件的名稱,null表示建立乙個匿名的互斥物件

);

當某乙個執行緒擁有互斥物件所有權後,就可以獨佔系統中受保護的資源;不再需要資源的時候,可以呼叫releasemutex函式釋放互斥物件的所有權;releasemutex函式每呼叫一次,遞迴計數器減1;直到減到0時才釋放互斥物件,互斥物件才變為通知狀態。

bool winapi releasemutex(

__in handle hmutex

);

等待互斥物件waitforsingleobject函式

dword winapi waitforsingleobject(

__in handle hhandle,//等待核心物件控制代碼

__in dword dwmilliseconds//等待時間,infinite表示無限等待

);

失敗返回wait_failed;

三、賣票系統試題

有三個賣票的位置;賣100張票;

cmutex.h檔案

#ifndef _cmutex_h__

#define _cmutex_h__

class cmutex

;#endif

#include "stdafx.h"

#include "cmutex.h"

int cmutex::ntickets = 100;

cmutex::cmutex()

cmutex::~cmutex()

if (null != m_hthread1)

if (null != m_hthread2)

if (null != m_hthread3) }

dword __stdcall cmutex::threadfun1(lpvoid lparam)

cout<

} return dret;

}dword __stdcall cmutex::threadfun2(lpvoid lparam)

cout<

} return dret;

}dword __stdcall cmutex::threadfun3(lpvoid lparam)

cout<

} return dret;

}void cmutex::startthread()

main.cpp

// mutex.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "cmutex.h"

int _tmain(int argc, _tchar* argv)

結果

如果不加互斥物件,將可能出現賣出0這一張票的可能性;

多執行緒 同步 Mutex互斥量

建立互斥量 handle createmutex lpsecurity attributes lpmutexattributes,安全性 bool binitialowner,true 建立執行緒擁有互斥量,false 相反 lpctstr lpname 執行緒名字,如果為null表示匿名,否則為命...

Linux執行緒同步 互斥量 mutex

互斥量從本質上說就是一把鎖,提供對共享資源的保護訪問.1.初始化 在linux下,執行緒的互斥量資料型別是pthread mutex t.在使用前,要對它進行初始化 對於靜態分配的互斥量,可以把它設定為pthread mutex initializer,或者呼叫pthread mutex init....

經典執行緒同步 互斥量Mutex

閱讀本篇之前推薦閱讀以下姊妹篇 秒殺多執行緒第四篇乙個經典的多執行緒同步問題 秒殺多執行緒第五篇經典執行緒同步關鍵段cs 秒殺多執行緒第六篇經典執行緒同步事件event 前面介紹了 關鍵段cs 事件event 在經典執行緒同步問題 中的使用。本篇介紹用互斥量mutex 來解決這個問題。互斥量也是乙個...