给出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)更有效率 然后只使用一个inifnite全局变量循环,例如:
while (!condition);
它看起来(对我来说)他们都忙着 - 等待变量条件变为真,唯一的区别是cond循环还检查一个不同的线程是否“发信号通知”cond变量。
答案 0 :(得分:4)
因为等待条件变量是非繁忙的等待。 CPU实际上没有做任何工作。相反,线程处于空闲状态,等待信号。在发出条件信号之前,不会给线程提供任何CPU资源。
当发出条件信号时,线程再次符合条件,并且调度程序可以再次为其分配CPU资源。
将繁忙的等待循环while (!condition)
与紧密循环中的旋转进行对比,不断检查condition
变量。
循环的原因是条件可能会发出信号,但是在此线程获取之前,其他人可能会锁定。因此,不是通过紧密循环检查条件是否为真,而是有一系列相对较长的非忙等待,每次等待一次测试。
有关详细信息,请参阅Condition Variables。