C 多執行緒學習 三 生產者和消費者 2

2021-05-22 02:07:36 字數 1063 閱讀 1442

下面定義生產者類 cellprod 和消費者類 cellcons ,它們都只有乙個方法threadrun(),以便在main()函式中提供給執行緒的threadstart**物件,作為執行緒的入口。

public

class

cellprod

public

void

threadrun( )

}public

class

cellcons

public

void

threadrun( )}

然後在下面這個類monitorsample的main()函式中,我們要做的就是建立兩個執行緒分別作為生產者和消費者,使用cellprod.threadrun()方法和cellcons.threadrun()方法對同乙個cell物件進行操作。

public

class

monitorsample

catch

(threadstateexception e)

catch

(threadinterruptedexception e)

//儘管main()函式沒有返回值,但下面這條語句可以向父程序返回執行結果

environment.exitcode

=result;}}

在上面的例程中,同步是通過等待monitor.pulse()來完成的。首先生產者生產了乙個值,而同一時刻消費者處於等待狀態,直到收到生產者的「脈衝(pulse)」通知它生產已經完成,此後消費者進入消費狀態,而生產者開始等待消費者完成操作後將呼叫monitor.pulese()發出的「脈衝」。

它的執行結果很簡單:

produce: 1

consume: 1

produce: 2

consume: 2

produce: 3

consume: 3

......

produce: 20

consume: 20

事實上,這個簡單的例子已經幫助我們解決了多執行緒應用程式中可能出現的大問題,只要領悟了解決執行緒間衝突的基本方法,很容易把它應用到比較複雜的程式中去。

C 多執行緒 三 生產者和消費者

前面說過,每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥...

C 多執行緒學習 三 生產者和消費者

前面說過,每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥...

C 多執行緒學習 三 生產者和消費者

前面說過,每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥...