[問題] semaphore使用的問題

看板C_and_CPP作者 (Zoxge)時間7年前 (2018/05/17 20:07), 7年前編輯推噓1(1021)
留言22則, 4人參與, 7年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 小弟是使用thread的新手,想練習一下semaphore的使用 下面連結的程式碼 開兩個thread,分別跑producer和consumer兩支function Buffer是一個stack架構 producer: 將Buffer的top位置填值,並將stack的top位置往上加 consumer: 將Buffer的top位置填值為0,並將stack的top位置往下減 producer第一次填值為1,每次填值都會是上一次的值+1,直到值加到10000, 兩個thread就呼叫 pthread_exit(NULL); 離開,然後程式結束。 因為Buffer的空間有1000格,使用兩個semaphore變數: empty與full producer進入,會將empty-1、full+1,就是放一個東西進Buffer的意思 consumer進入,會將empty+1、full-1,就是從Buffer拿走一個東西的意思 想請問一下 1.Buffer有1000格,一開始都沒有放東西,所以對empty與full init的方法是對的嗎? sem_init(&empty, 0, 1000); sem_init(&full, 0, 0); 2.我也好奇,sem_wait 和 sem_post 要怎麼知道Buffer有1000格呢? 要如何讓程式知道empty=1000表示Buffer是全空,full=1000表示Buffer是全滿呢? 3.另外小弟的code邏輯上是否有什麼錯誤嗎? 謝謝 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) https://ideone.com/MyhKC7 (new) https://ideone.com/xv22NM (old) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.95.44 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1526558837.A.907.html ※ 編輯: Zoxge (123.192.95.44), 05/17/2018 20:09:30

05/17 23:50, 7年前 , 1F
top與iNum有data race喔,麻煩用mutex或atomic之類的
05/17 23:50, 1F

05/18 00:59, 7年前 , 2F
你有跑過嗎
05/18 00:59, 2F

05/18 08:06, 7年前 , 3F
有跑過喔 請問哪裡有問題呢?
05/18 08:06, 3F

05/18 08:07, 7年前 , 4F
我有用mutex保護 pthread_mutex_lock( &mutex1 );
05/18 08:07, 4F

05/18 08:07, 7年前 , 5F
請問會有race的原因是哪裡呢?
05/18 08:07, 5F

05/18 13:48, 7年前 , 6F
看起來怪怪的,你的semaphore 定為1000和0就已經定義了buffe
05/18 13:48, 6F

05/18 13:48, 7年前 , 7F
r的上下限,為何還要各自一個迴圈做判斷是否為空或滿
05/18 13:48, 7F

05/18 13:55, 7年前 , 8F
一樓指的是你mutex外面有用到shared variable沒包到,你取
05/18 13:55, 8F

05/18 13:55, 7年前 , 9F
到的值有可能不正確
05/18 13:55, 9F
※ 編輯: Zoxge (123.192.95.44), 05/18/2018 22:35:25

05/18 22:36, 7年前 , 10F
感謝提醒,我沒弄清楚semaphore的用法,那迴圈的確是多餘的
05/18 22:36, 10F

05/18 22:37, 7年前 , 11F
另外小弟想到一個問題,當consumer超過一個 (上面new code)
05/18 22:37, 11F

05/18 22:38, 7年前 , 12F
有可能發生多個consumer同時等到 sem_wait( &full ); 成立
05/18 22:38, 12F

05/18 22:38, 7年前 , 13F
但其實Buffer內資源不足的情況
05/18 22:38, 13F

05/18 22:39, 7年前 , 14F
例如producer已經停止產生新資源,而Buffer內只剩1個資源,
05/18 22:39, 14F
※ 編輯: Zoxge (123.192.95.44), 05/18/2018 22:43:08

05/18 22:43, 7年前 , 15F
那就只會有一個consumer能夠跑完,其餘的consumer只能永遠
05/18 22:43, 15F

05/18 22:44, 7年前 , 16F
卡在等 sem_wait( &full ); 成立,這樣code就跑不完了 @@
05/18 22:44, 16F

05/18 22:44, 7年前 , 17F
這種問題該怎麼解決呢?
05/18 22:44, 17F

05/19 12:16, 7年前 , 18F
semaphore本來就設計成這樣,所以卡住很正常
05/19 12:16, 18F

05/19 12:19, 7年前 , 19F
要解決這問題,你可以
05/19 12:19, 19F

05/19 12:19, 7年前 , 20F
1.自行做semamphore,專門為這種狀況處理
05/19 12:19, 20F

05/19 12:19, 7年前 , 21F
2.不要用semaphore,改成用mutex,做non-block的query,
05/19 12:19, 21F

05/19 12:19, 7年前 , 22F
不過如果想要持續等待,就要自己spin
05/19 12:19, 22F
文章代碼(AID): #1Q_N1ra7 (C_and_CPP)