组合信号量和旋转锁定在C?

时间:2012-09-21 14:08:31

标签: c concurrency semaphore spinlock

是否可以在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);

}

如果孩子未能在5秒内设置parent_sem,我希望父母取消阻止,如果孩子提前设置了parent_sem,则希望在5秒之前取消阻止,同时最小化检查和重新学习的CPU周期数。在这5秒内检查parent_sem的状态。我知道我可以通过旋转锁来做到这一点,但将等待时间设置为高(即1秒)意味着大部分时间浪费近1秒。将其设置为低(例如100ms)意味着在孩子超时的情况下进行50次检查。这些都不是一个很好的解决方案。

1 个答案:

答案 0 :(得分: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);
}

我已经使用这种方法来增加线程的健壮性。也就是说,您不希望无限期地阻止您的线程,因为可能存在错误并且您想要终止它们,或者您可能只是想让它们退出。另一方面,你想要尽快醒来。

此解决方案满足两个条件。