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

如果子级未能在5秒内设置parent_sm,我希望父级取消阻止,但如果子级提前设置parent_sem,也希望在5秒内取消阻止,同时最大限度地减少在这5秒内检查和重新检查parent_sm状态所花费的CPU周期数。我知道我可以用旋转锁定来完成这项工作,但将等待时间设置为高(即1秒)意味着大部分时间几乎浪费1秒。将其设置为低(例如100ms)意味着在孩子超时的情况下进行50次检查。这两者都不是一个好的解决方案。

这正是定时锁的作用。根据您的库,它们可能可用,也可能不可用。

你的例子:

父级:

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

我使用这种方法来提高线程的健壮性。也就是说,你不希望你的线程被无限期地阻止,因为可能有错误,你想终止它们,或者你可能只是想让它们退出。另一方面,你会希望尽快醒来。

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

最新更新