c 互斥鎖(Mutex)使用詳解

2021-06-21 04:24:23 字數 2810 閱讀 6638

互斥鎖(mutex)

互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。

互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況

函式://建立乙個處於未獲取狀態的互斥鎖

public mutex();

//如果owned為true,互斥鎖的初始狀態就是被主線程所獲取,否則處於未獲取狀態

public mutex(bool owned);

如果要獲取乙個互斥鎖。應呼叫互斥鎖上的waitone()方法,該方法繼承於thread.waithandle類

它處於等到狀態直至所呼叫互斥鎖可以被獲取,因此該方法將組織住主調執行緒直到指定的互斥鎖可用,如果不需要擁有互斥鎖,用releasemutex方法釋放,從而使互斥鎖可以被另外乙個執行緒所獲取。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

namespace

myttcon

class

incthread

void

run()

while

(number 

>0);

console.writeline(thrd.name +"

釋放 the nmutex");

//釋放

shareres.mutex.releasemutex();}}

class

decthread

void

run()

while

(number 

>0);

console.writeline(thrd.name +"

釋放 the nmutex");

//釋放

shareres.mutex.releasemutex();}}

class

program}}

system.threading.mutex在概念上和system.threading.monitor幾乎完全一致,只是lock關鍵字用的不是它,而且它旨在程序間的同步。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

namespace

class

test

else

console.readline();}}

}執行以上**生成的應用程式第乙個例項,會得到結果

running

保持第乙個執行狀態,執行第二個例項,得到結果

another 

isrunning

以上**中建立了乙個mutex,從其引數的解釋中得知,第乙個呼叫執行緒將得到互斥體的初始所屬權,如果不釋放的話,其他的執行緒得不到互斥體所有權

下面看一段**(出自 ),稍有改動

using

system;

using

system.collections.generic;

using

system.text;

using

system.threading;

namespace

monitorlockmutex

public

program()

public

void

runthread()

private

void

thread1func()

}private

void

thread2func() }

private

void

testfunc(

string

str) "

, str, system.datetime.now.millisecond);}}

}兩個執行緒基本上是按照各自的時間間隔+testfunc的執行時間對testfunc函式進行讀取

將公共呼叫的函式加鎖

private

void

testfunc(

string

str) "

, str, system.datetime.now.millisecond);

}            

}再次執行檢視結果,好像沒什麼區別?

加入mutex

private

void

thread1func()

mutex.releasemutex();

}private

void

thread2func()

mutex.releasemutex();

}再次執行檢視結果。

想到了什麼?thread1func() 或者thread2func()中的全部執行完畢,之後釋放互斥體,然後剩下的那個才可以訪問。

再改動一次

private

void

thread1func()

}           

}private

void

thread2func()

}           

}看效果……

輪換執行……

【from  hsrzyn

互斥鎖 mutex 的使用

互斥鎖的使用範圍 互斥鎖 mutex 是在原子操作api的基礎上實現的訊號量行為。互斥鎖不能進行遞迴鎖定或解鎖,能用於互動上下文但是不能用於中斷上下文,同一時間只能有乙個任務持有互斥鎖,而且只有這個任務可以對互斥鎖進行解鎖。當無法獲取鎖時,執行緒進入睡眠等待狀態。互斥鎖的資料結構 struct mu...

C 實現mutex 互斥鎖

思路 實現mutex最重要的就是實現它的lock 方法和unlock 方法。我們儲存乙個全域性變數flag,flag 1表明該鎖已經鎖住,flag 0表明鎖沒有鎖住。實現lock 時,使用乙個while迴圈不斷檢測flag是否等於1,如果等於1就一直迴圈。然後將flag設定為1 unlock 方法就...

c 互斥鎖mutex使用方法

多執行緒修改基本資料型別時,也可能出現同步問題,哪怕時最簡單的累加操作。通過mutex在對同乙個資料操作時加鎖,實現了對資源的獨佔。pragma once include include include include using namespace std class mutextest prin...