[問題] semaphore使用的問題

作者: Zoxge (Zoxge)   2018-05-17 20:07:12
開發平台(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)
作者: Caesar08 (Caesar)   2018-05-17 23:50:00
top與iNum有data race喔,麻煩用mutex或atomic之類的
作者: djshen (djshen)   2018-05-18 00:59:00
你有跑過嗎
作者: Zoxge (Zoxge)   2018-05-18 08:06:00
有跑過喔 請問哪裡有問題呢?我有用mutex保護 pthread_mutex_lock( &mutex1 );請問會有race的原因是哪裡呢?
作者: cphe (魔鬼藏在垃圾筒裡)   2018-05-18 13:48:00
看起來怪怪的,你的semaphore 定為1000和0就已經定義了buffer的上下限,為何還要各自一個迴圈做判斷是否為空或滿一樓指的是你mutex外面有用到shared variable沒包到,你取到的值有可能不正確
作者: Zoxge (Zoxge)   2018-05-18 22:36:00
感謝提醒,我沒弄清楚semaphore的用法,那迴圈的確是多餘的另外小弟想到一個問題,當consumer超過一個 (上面new code)有可能發生多個consumer同時等到 sem_wait( &full ); 成立但其實Buffer內資源不足的情況例如producer已經停止產生新資源,而Buffer內只剩1個資源,那就只會有一個consumer能夠跑完,其餘的consumer只能永遠卡在等 sem_wait( &full ); 成立,這樣code就跑不完了 @@這種問題該怎麼解決呢?
作者: Caesar08 (Caesar)   2018-05-19 12:16:00
semaphore本來就設計成這樣,所以卡住很正常要解決這問題,你可以1.自行做semamphore,專門為這種狀況處理2.不要用semaphore,改成用mutex,做non-block的query,不過如果想要持續等待,就要自己spin

Links booklink

Contact Us: admin [ a t ] ucptt.com