多執行緒同步的原理

CalmReason發表於2016-03-12

多程式多執行緒基本介紹參考

多執行緒執行

執行緒之間以併發(注意不是並行,並行是互相毫不相干的各自同時執行)方式執行。但是由於多執行緒往往擁有共同的臨界資源,比如印表機,全域性變數,控制檯等。這種資源一次只允許一個執行緒訪問和使用(互斥)。使得多執行緒必須要按照一定的次序序列執行(同步)共享資源。

在各個執行緒中使用、操作共享資源的程式碼段叫臨界區。

訊號量

訊號量是一種資料結構

一般由兩個成員組成:數值、指標

一般來說,訊號量的值代表著當前資源的使用情況

訊號量的值只能由P、V操作來改變

不同的訊號量可以實現不同場景下的執行緒同步,但是都是由P、V操作來實現。

P、V操作

P、V操作都是原子操作

P申請一個單位資源,申請不到就等待

V釋放一個單位資源,如果有等待執行緒就喚醒

P操作

P(S) 

--S

如果S<0,等待

如果S>=0,繼續

V操作

V(S)

++S

如果S>0,繼續

如果S<=0,喚醒

根據P、V操作中使用的變數個數和大小,可以實現多種執行緒同步的場景:互斥體訊號量讀寫鎖等。這些同步工具都有類似的介面,如獲取(acquire)、釋放(release)等。

用P、V操作實現互斥

互斥訊號量mutex=1實現互斥使用印表機



用P、V操作實現簡單同步

多訊號量實現生產者和消費者(單緩衝區同步)





相關文章