多執行緒程式設計之按序列印(leetcode 1114)

2021-10-06 12:32:08 字數 2380 閱讀 6150

提供了乙個類:

public

class

foopublic

void

two(

)public

void

three()

}

三個不同的執行緒將會共用乙個 foo 例項。

請設計修改程式,以確保 two() 方法在 one() 方法之後被執行,three() 方法在 two() 方法之後被執行。

多個執行緒在cpu中執行,執行不同的程式段,但是這些程式之間有先後關係:

也屬於併發的問題:

併發主要為多工情況設計。但如果應用不當,可能會引發一些漏洞。按照情況不同,可以分為三種:

競態條件是指同乙個程式多執行緒訪問同乙個資源,如果對資源的訪問順序敏感,就稱存在競態條件,**區成為臨界區。

最常見的競態條件為:先檢測後執行。(比如有乙個if判斷語句,多個執行緒都通過這個判斷時候,下一步的執行可能造成各種奇怪的結果)

競態條件的解決方案為:需要某些關鍵部分**具有排他性,即在給定的時間內,只有乙個執行緒可以進入關鍵部分**。(可以將這種機制看做限制關鍵部分**訪問的鎖)

總之,為了防止出現併發競爭狀態,需要一種具有兩種功能的機制:

關鍵部分的訪問控制。

通知阻塞執行緒。

訊號量和互斥鎖(mutex)的區別:互斥鎖只允許乙個執行緒進入臨界區,而訊號量允許多個執行緒同時進入臨界區。

#include

//訊號量semaphore標頭檔案

class

foovoid

first

(function<

void()

> printfirst)

void

second

(function<

void()

> printsecond)

void

third

(function<

void()

> printthird)

};

semaphore是由作業系統提供的。

訊號量的資料型別為結構sem_t,它本質上是乙個長整型的數。

sem_init:

int

sem_init

(sem_t *sem,

int pshared,

unsigned

int value)

;sem :指向訊號量物件

pshared : 指明訊號量的型別。不為0時此訊號量在程序間共享,否則只能為當前程序的所有執行緒共享。

value : 指定訊號量值的大小

sem_init

() 成功時返回 0;錯誤時,返回 -

1,並把 errno 設定為合適的值。

sem_post:sem_post是給訊號量的值加上乙個「1」,它是乙個「原子操作」---即同時對同乙個訊號量做加「1」操作的兩個執行緒是不會衝突的;

int

sem_post

(sem_t *sem)

;sem_post

() 成功時返回 0;錯誤時,訊號量的值沒有更改,-

1 被返回,並設定 errno 來指明錯誤

sem_wait:sem_wait是乙個函式,也是乙個原子操作,它的作用是從訊號量的值減去乙個「1」,但它永遠會先等待該訊號量為乙個非零值才開始做減法。也就是說,如果你對乙個值為2的訊號量呼叫sem_wait(),執行緒將會繼續執行,將訊號量的值將減到1。

如果對乙個值為0的訊號量呼叫sem_wait(),這個函式就會原地等待直到有其它執行緒增加了這個值使它不再是0為止。(也就是說是等於0時會阻塞操作)

int

sem_wait

(sem_t *sem)

class

foovoid

first

(function<

void()

> printfirst)

void

second

(function<

void()

> printsecond)

void

third

(function<

void()

> printthird)

private

: std::mutex m2, m3;

};

力扣(leetcode)

c++多執行緒同步之semaphore(訊號量)

程序間通訊方式——訊號量(semaphore)

執行緒同步之訊號量(sem_init,sem_post,sem_wait)

多執行緒 LeetCode 按序列印

我們提供了乙個類 public class foo public void two public void three 三個不同的執行緒將會共用乙個 foo 例項。執行緒 a 將會呼叫 one 方法 執行緒 b 將會呼叫 two 方法 執行緒 c 將會呼叫 three 方法請設計修改程式,以確保 t...

多執行緒按順序列印

於leetcode1114 我們提供了乙個類 public class foo public void second public void third 三個不同的執行緒將會共用乙個 foo 例項。請設計修改程式,以確保 second 方法在 first 方法之後被執行,third 方法在 seco...

1114 按序列印 多執行緒

難度簡單237 我們提供了乙個類 public class foo public void second public void third 三個不同的執行緒 a b c 將會共用乙個foo例項。請設計修改程式,以確保second 方法在first 方法之後被執行,third 方法在second 方...