多執行緒修改基本資料型別時,也可能出現同步問題,哪怕時最簡單的累加操作。通過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...