2012-09-21 36 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

是的,这看起来正是我想要的。谢谢! –