同步與非同步(執行緒)

2021-08-22 18:14:34 字數 997 閱讀 2399

有兩個執行緒在併發執行以下**段, 其中 g 是 int 型別的全域性變數。 請

問當兩個執行緒都執行完畢該**段後, g 的值的取值範圍為50000-100000。

for (int i = 1; i <= 50000; i++)
當多個控制線程共享內容的記憶體時,需要確保每個執行緒看到一致的資料檢視。如果每個執行緒使用的變數都是其他執行緒不會讀取和修改的,那麼就不存在一致性的問題。但是,當乙個執行緒可以修改的變數,其他執行緒亦可以讀取或者修改的時候,我們就需要對這些執行緒進行同步,確保他們在訪問變數的儲存內容時不會訪問到無效的值。

上面的題就是乙個例子,(除過一些特別極端的情況)上面的取值範圍為50000-100000,為什麼會出現這種情況呢

兩個或多個執行緒試圖在同一時間修改統一變數時,需要進行同步。

而對於同步這個概念,之前總是不是很理解,把同步和非同步混淆。以為同步是同時發生,非同步是不同時間發生,這是不對的

同步是讓不同的執行緒對乙個變數的操作不是同時發生,因為如果乙個執行緒在對乙個變數進行寫操作的時候,另乙個執行緒對這個變數進行讀操作(這時另乙個執行緒的寫操作並沒有完成),這時就會產生一些不一致的值。

考慮變數增量操作的情況,增量操作通常分解為以下三步。

1.從記憶體單元讀入暫存器

2.在暫存器中對變數進行增量操作

3.把新的值寫回記憶體單元

如果兩個執行緒試圖幾乎在同一時間對統一變數做增量操作而不進行同步的話,結果就可能出現不一致,變數可能比原來增加了1,也有可能比原來增加2,具體增加了1還是2要取決與第二個執行緒開始操作時獲取的數值。如果第二個執行緒執行第一步要比第乙個執行緒執行第三步要早,第二個執行緒讀到的值與第乙個執行緒一樣,為變數加1,然後再寫回去,事實上沒有實際的效果,總的來說變數只增加了1

執行緒同步與非同步

多執行緒併發時,多個執行緒同時請求同乙個資源,必然導致此資源的資料不安全,a執行緒修改了b線 程的處理的資料,而b執行緒又修改了a執行緒處理的數理。顯然這是由於全域性資源造成的,有時為了解 決此問題,優先考慮使用區域性變數,退而求其次使用同步 塊,出於這樣的安全考慮就必須犧牲 系統處理效能,加在多執...

多執行緒 執行緒同步 非同步

同步和非同步 同步和非同步通常用來形容一次方法的呼叫。同步方法呼叫一旦開始,呼叫者必須完成所有的操作一直到方法呼叫結束,其他呼叫者才能繼續後續的行為,非同步方法呼叫類似乙個訊息傳遞,一旦開始,方法呼叫就會立即返回,其他呼叫者則可以無需等待,可以立即繼續後續的操作。非同步 不過,如果 我們 趕時髦,就...

執行緒同步和非同步

執行緒同步和執行緒非同步有什麼區別?重要基礎知識 打個比方,如果你在等乙個人,同步的時候,你會一直等到她來了之後才做其他事情,這個過程除了等待你啥都不會做,非同步的時候,你一邊在等,可能一邊玩遊戲或者是看報紙什麼的,一直到她到來,你的等待狀態才會結束 在實現上,同步的過程會阻塞程序的所有其他操作,將...