執行緒學習5 競態條件

2021-09-06 03:31:36 字數 1107 閱讀 7958

競態條件

概述:如果兩個或兩個以上的執行緒同時訪問相同的物件,或者訪問不同步的共享狀態.就會出現競態條件。

舉例:如果多個執行緒同時訪問類statethread中的方法,最後結果會如何呢?

定義乙個類statethread,它包含乙個int欄位mstate和乙個方法changeintvalue。在changeintvalue方法中,驗證mstate變數是否包含10,如果是,就增其值。

在給5增值後mstate變數的值應該是11,但是事實並不一定如此。

例如,如果乙個執行緒剛好執行到if(mstate==10),就被其它執行緒搶先,排程器去執行另乙個執行緒。

第二個執行緒進入if體,將mstate值增加,即此時mstate=11, 而後第乙個執行緒現在再次被安排執行,進入if體,mstate再次被增加,即mstate=12。

也就是說,只要存在mstate=12時,就發生競態條件。

statethread類:

public

class

statethread

mstate =10

;}}}

public

intgetstate

set}}

入口方法main:

static

void

main(

string

args)

console.writeline(obj.getstate.tostring());

console.read();

}

執行結果:當執行結果中有thread n(0,1,2,3) 12 時

因為解決方法涉及到lock語句,在後面的章節會進行講解。

12 競態條件 時序競態

sleep函式幾點說明 1 sleep函式作用,讓程序睡眠。2 能被訊號打斷,然後處理訊號函式以後,就不再睡眠了。直接向下執行 3 sleep函式的返回值,是剩餘的秒數 sleep是可被中斷的睡眠,但不一定睡夠100s sleep是可中斷的睡眠 void handler int num if 1 v...

什麼是競態條件

1 什麼是競態條件?當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的 區稱作臨界區。在臨界區中使用適當的同步就可以避免競態條件。臨界區實現方法有兩種,一種是用synchronized,一種是用lock顯式鎖實現。2 例項 class counter 觀察執行...

linux作業系統之競態條件(時序競態)

1 時序競態 前後兩次執行同乙個程式,出現的結果不同。2 pause函式 使用該函式會造成程序主動掛起,並等待訊號喚醒,呼叫該系統呼叫的程序會處於阻塞狀態 主動放棄cpu 函式原型 int pause void 返回值為 1,並設定errno為eintr 使用pause和alarm實現sleep函式...