c 互斥鎖mutex使用方法

2021-10-03 07:29:30 字數 1345 閱讀 2010

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

#pragma once

#include

#include

#include

#include

using

namespace std;

class

mutextest

printf

("thread %d value: %d\n"

,this_thread::

get_id()

, _val2)

;//cout也是執行緒不安全,不能保證整個cout不被其他執行緒終端

_mutex.

lock()

;for

(int i =

0; i <

10000000

; i++

)printf

("thread %d mutexvalue: %d\n"

, this_thread::

get_id()

, _val1)

;//cout也是執行緒不安全,不能保證整個cout不被其他執行緒終端

_mutex.

unlock()

;}void

dotest()

};mutex mutextest::_mutex;

int mutextest::_val1=0;

int mutextest::_val2=

0;

thread 16640 value: 9612465

thread 16516 value: 10343307

thread 16640 mutexvalue: 10000000

thread 16516 mutexvalue: 20000000

不加互斥量訪問,會導致實際累加的結果不是我們期望的最終結果20000000,而只有10343307。原因在於++操作不是乙個原子操作。

++操作其實包含以下三步

register1 = _val2

register1 = register1+1

_val2 = register1

多執行緒訪問時,可能出現以下情況

register1=_val2

reigster2=_val2

resigter1=_val2+1

register2=_val2+1

_val2=register1

_val2=register2

這種情況下,實際會少加1,所以才會有**輸出的現象,結果小於2000000,甚至很接近10000000。

互斥鎖mutex的使用方法

一,鎖的建立 鎖可以被動態或靜態建立,可以用巨集pthread mutex initializer來靜態的初始化鎖,採用這種方式比較容易理解,互斥鎖是pthread mutex t的結構體,而這個巨集是乙個結構常量,如下可以完成靜態的初始化鎖 pthread mutex t mutex pthrea...

c 互斥鎖(Mutex)使用詳解

互斥鎖 mutex 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況 函式 建立乙個處於未獲取狀態的互斥鎖 public mutex 如果owned為true,互斥鎖的初始狀態就是被主線程所獲取,否則處於未獲取狀態 pu...

互斥鎖 mutex 的使用

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