【发布时间】:2012-09-21 14:08:31
【问题描述】:
是否可以在 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 次检查。这些都不是一个好的解决方案。
【问题讨论】:
-
“定期唤醒线程以检查某个变量的状态。(如自旋锁)”自旋锁有时不会唤醒线程,因为自旋锁是一个锁,当被持有时,保持 CPU 旋转(即使用所有 CPU)一小段时间,直到锁被释放。主要用于持有时间很短的锁
标签: c concurrency semaphore spinlock