给定以下来自 SDL wiki 的代码示例:
SDL_bool condition = SDL_FALSE;
SDL_mutex *lock;
SDL_cond *cond;
lock = SDL_CreateMutex();
cond = SDL_CreateCond();
.
.
Thread A:
SDL_LockMutex(lock);
while (!condition) {
SDL_CondWait(cond, lock);
}
SDL_UnlockMutex(lock);
Thread B:
SDL_LockMutex(lock);
...
condition = SDL_TRUE;
...
SDL_CondSignal(cond);
SDL_UnlockMutex(lock);
为什么使用条件等待(SDL_CondWait)被认为更有效 然后只需使用无限全局变量循环,例如:
while (!condition);
(在我看来)它们都在忙着等待变量条件变为真,唯一的区别是 cond 循环还检查是否有不同的线程“发出信号”给 cond 变量。
最佳答案
因为等待条件变量是非忙等待。 CPU 实际上没有做任何工作。相反,线程处于空闲状态,等待信号。在发出条件信号之前,线程不会获得任何 CPU 资源。
当条件发出信号时,线程再次符合条件,调度程序可以再次为其分配 CPU 资源。
将其与繁忙的等待循环对比,while (!condition)
在紧密循环中旋转,不断检查 condition
变量。
循环的原因是条件可能已发出信号,但在该线程获取锁之前锁可能被其他人占用。因此,您有一系列相对较长的非繁忙等待,而不是一个紧密的循环来检查条件是否为真,每个等待后跟一个测试。
参见 Condition Variables了解更多详情。
关于c - 'busy-wait'无限循环和条件验证无限循环的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969200/