執行緒寫,另執行緒讀,需要加鎖嗎,乙個執行緒寫,另乙個執行緒讀,需要加鎖嗎

2022-04-09 20:55:20 字數 2478 閱讀 3009

1樓:匿名使用者

多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。

來看看多個執行緒同時操作乙個變數怎麼把內容給改亂了:

import time, threading# 假定這是你的銀行存款:balance = 0def change_it(n):

# 先存後取,結果應該為0:

global balance

balance = balance + n

balance = balance - ndef run_thread(n):

for i in range(100000):#當這個數足夠大時,結果總會出現問題的

change_it(n)

t1.start()

t2.start()

t1.join()

t2.join()

print(balance)

balance = balance + n

我們定義了乙個共享變數balance,初始值為0,並且啟動兩個執行緒,先存後取,理論上結果應該為0,但是,由於執行緒的排程是由作業系統決定的,當t1、t2交替執行時,只要迴圈次數足夠多,balance的結果就不一定是0了。

原因是因為高階語言的一條語句在cpu執行時是若干條語句,即使乙個簡單的計算:

也分兩步:

計算balance + n,存入臨時變數中;

將臨時變數的值賦給balance。

也就是可以看成:

x = balance + nbalance = x

由於x是區域性變數,兩個執行緒各自都有自己的x,當**正常執行時:

初始值 balance = 0

t1: x1 = balance + 5 # x1 = 0 + 5 = 5

t1: balance = x1     # balance = 5

t1: x1 = balance - 5 # x1 = 5 - 5 = 0

t1: balance = x1     # balance = 0

t2: x2 = balance + 8 # x2 = 0 + 8 = 8

t2: balance = x2     # balance = 8

t2: x2 = balance - 8 # x2 = 8 - 8 = 0

t2: balance = x2     # balance = 0

結果 balance = 0

是t1和t2是交替執行的,如果作業系統以下面的順序執行t1、t2:

初始值balance = 0

t1: x1 = balance + 5  # x1 = 0 + 5 = 5

t2: x2 = balance + 8  # x2 = 0 + 8 = 8

t2: balance = x2      # balance = 8

t1: balance = x1      # balance = 5

t1: x1 = balance - 5  # x1 = 5 - 5 = 0

t1: balance = x1      # balance = 0

t2: x2 = balance - 8  # x2 = 0 - 8 = -8

t2: balance = x2   # balance = -8

結果 balance = -8

究其原因,是因為修改balance需要多條語句,而執行這幾條語句時,執行緒可能中斷,從而導致多個執行緒把同乙個物件的內容改亂了。

兩個執行緒同時一存一取,就可能導致餘額不對,你肯定不希望你的銀行存款莫名其妙地變成了負數,所以,我們必須確保乙個執行緒在修改balance的時候,別的執行緒一定不能改。

如果我們要確保balance計算正確,就要給change_it()上一把鎖,當某個執行緒開始執行change_it()時,我們說,該執行緒因為獲得了鎖,因此其他執行緒不能同時執行change_it(),只能等待,直到鎖被釋放後,獲得該鎖以後才能改。由於鎖只有乙個,無論多少執行緒,同一時刻最多只有乙個執行緒持有該鎖,所以,不會造成修改的衝突。

from :網頁鏈結

借的廖雪峰的python3教程來說事.

2樓:匿名使用者

說法不一,如果不加鎖的話不知道讀到的資料是寫之前還是寫之後,感覺為了防止意外,還是加個讀寫鎖比較好。

多個執行緒讀寫std:map,讀執行緒需要加鎖嗎

3樓:會飛的呆頭

需要加,當你在修改map中的值的時候,內部連結串列會改變,這時候你去讀,程式可能會崩潰

建議加乙個讀寫鎖上去,這樣既不影響讀效率,還可以避免上述問題

關於執行緒題目,關於執行緒乙個題目

foxcoming我就是說b執行緒等待sleeper2執行緒執行完然後再繼續執行,請看清楚別人的回答再下結論 執行緒 a sleeper1列印0 先執行main函式的執行緒sleep1的run方法中的迴圈輸出0,然後睡眠 執行緒 a sleeper1interrupted 執行到sleep1被打斷前...

另C語言問題,另乙個C語言問題?

include int fun int a int main c語言 可以在乙個函式中定義另乙個函式為什麼不對?語法規定,這是不對的,如果那麼做會出現編譯錯誤。函式是用來呼叫並實現某種功能的。作為一種方法,函式是獨立的。正是因為這種特性,才把一些特殊的 常用的方法抽取出來封裝成乙個個的函式。因此把乙...

另自己的歌詞,另乙個自己的歌詞

ti 另乙個自己 ar 萬芳 al by bzmtv.com offset 500 00 02.00 另乙個自己 00 19.00 聚光燈下沒有躲藏的縫隙 00 24.00 自己是完全透明 00 27.00 聲音迴盪在廣大的空間裡 00 31.00 好陌生好多回憶 00 36.00 人到 00 37...