2012-09-21 66 views
1

是否可以在C中構建一種組合的信號量/旋轉鎖定?組合信號量和C中的旋轉鎖?

也就是說,我想它支持線程控制結構:

  • 定期喚醒線程檢查一些變量的狀態。 (如自旋鎖)
  • 如果結構的狀態被另一個線程(如sem_wait/sem_post)更改,則自動喚醒線程。

例如,在這樣的程序:

家長:

while(something){ 
    //do some stuff here. 
    sem_post(child_sem); 
    sem_wait(parent_sem); 
} 

兒童:

while(something_else){ 
    sem_wait(child_sem); 
    //do some other stuff here. 
    sem_post(parent_sem); 

} 

我想父疏通如果孩子不能設置parent_sem在5秒鐘之內,如果孩子已經早點設置了parent_sem,則在5秒鐘之前解除阻塞,同時最小化CPU週期消耗的數量在這5秒內檢查並重新檢查parent_sem的狀態。我知道我可以用旋轉鎖來做到這一點,但是將等待時間設置得很高(即1秒)意味着大部分時間浪費近1秒。設置爲低(例如100ms)意味着在孩子超時的情況下進行50次檢查。這些都不是一個很好的解決方案。

+1

「定期喚醒線程以檢查某些變量的狀態(如自旋鎖)」自旋鎖並不會喚醒線程,因爲自旋鎖是一個鎖,當它保持時,它會保持CPU在旋轉(即使用全部CPU)一段時間,直到釋放鎖。主要用於持續時間很短的鎖 –

回答

2

這正是定時鎖的用途。根據你的圖書館,他們可能會或可能不可用。

你舉的例子:

家長:

while(something){ 
    //do some stuff here. 
    sem_post(child_sem); 
    while (sem_timed_wait(parent_sem, MAX_WAIT_TIME) == TIMEOUT) 
     // check whether you should still continue waiting 
} 

兒童:

while(something_else){ 
    while (sem_timed_wait(child_sem, MAX_WAIT_TIME) == TIMEOUT) 
     // check whether you should still continue waiting 
    //do some other stuff here. 
    sem_post(parent_sem); 
} 

我已經使用這個方法來增加我的線程的魯棒性。也就是說,你不希望你的線程無限期地被阻塞,因爲可能有錯誤,你想終止它們,或者你可能只是想讓它們退出。另一方面,你會想盡快醒來。

該解決方案滿足這兩個條件。

+0

是的,這看起來正是我想要的。謝謝! –