1

是否可以在 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 秒。将其设置为低(例如 100 毫秒)意味着在孩子超时的情况下进行 50 次检查。这些都不是一个好的解决方案。

4

1 回答 1

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);
}

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

该解决方案满足这两个条件。

于 2012-09-21T14:15:22.887 回答