linux執行緒6 CSDN論壇上很火的乙個討論貼)

2021-07-05 08:11:54 字數 837 閱讀 6456

有乙個全域性變數

int sum=0

執行兩個執行緒,**如下:

for(int i=1;i<=50;i++)

sum=sum+1;

問兩個執行緒都執行完後,sum的取值範圍。

本人雖然執行了n遍,結果都是100,但這是個概率事件,只是100的概率很大。為什麼還可能出現其他結果?

這是由於執行緒執行的併發性,第乙個執行緒還沒執行完,就被另乙個執行緒打斷,即使只有一句,如果不是原子操作,仍然可以被打斷。

部落格中討論出了多種結果,一些明顯不對外,本人列出一些有說服力的結果,旨在理解多執行緒併發執行機制。

第一種:50-100

這種結果,考慮了執行緒之間相互覆蓋的結果,最差也就相當於只跑一次但執行緒的效果,所以最低是50.

第二種:1-100

沒有給出理由,但是1有沒有可能出現呢?

第三種:2-100

本人比較認同這種結果,2-49之間的值幾乎不可能,但是理論上存在,前面也說了,這是概率事件,只是出現的概率極低,下面分析2-49出現的可能。

首先讓第乙個執行緒取得sum=0,不執行加1操作;然後讓第二個執行緒迴圈49次,接著用第乙個執行緒執行到1-50之間的值,然後第二個執行緒取得這個值,接著第乙個執行緒執行完,第二個執行緒在這個值的基礎上加1,於是可以得到2-51之間的值,這個需要6次配合,條件苛刻,概率極低。

下面重點說下為什麼最低是2.

很簡單,就考慮最差的情況,如果第乙個執行緒取得sum=0,還沒有加1就被另乙個執行緒打斷,不管怎樣,最後一定會完成這個加1動作,同樣,第二個執行緒也是。所以最低不能低於2.

其實歸根到底,問題出現的原因是,sum=sum+1不是原子操作。

CSDN論壇上的一些面試題收集

1.時分秒針在一天之類重合多少次?正確答案是兩次 程式如下 include 設定時分秒針的速度 時針720秒走一格,分針60秒走一格,秒針1秒走一格,鐘錶一圈共60格 因此時針速度為1 720,分針速度為1 60,但在程式中為了便於實現,全部擴大720倍 所以得出如下巨集定義 define v h ...

linux執行緒筆記6

互斥鎖的缺點是它只有兩種狀態 鎖定和非鎖定 條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補互斥鎖的不足。條件變數內部是乙個等待佇列,放置等待的執行緒,執行緒在條件變數上等待和通知,互斥鎖用來保護等待佇列 對等待佇列上鎖 條件變數通常和互斥鎖一起使用 條件變數允許執行緒等待特定條件發生...

linux執行緒5 上一道題)

題目 1 2 3 30000,在加的過程中,要使用3個多執行緒完成,並且全部計算好以後,得出最終的和數。這題比較簡單,都沒用到條件,感覺互斥鎖也可以不用的,但是結果不對,下面是我寫的一種實現。不用互斥鎖的話,三個執行緒相互併發覆蓋對方的執行結果,造成錯誤。include include includ...