是否可以在C中构建一种组合的信号量/自旋锁?
也就是说,我想要一个支持的线程控制结构:
例如在这样的程序中:
父:
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次检查。这些都不是一个很好的解决方案。
答案 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);
}
我已经使用这种方法来增加线程的健壮性。也就是说,您不希望无限期地阻止您的线程,因为可能存在错误并且您想要终止它们,或者您可能只是想让它们退出。另一方面,你想要尽快醒来。
此解决方案满足两个条件。