'busy-wait'无限循环和条件验证无限循环之间的区别

时间:2014-05-31 10:53:51

标签: c multithreading sdl

给出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变量。

1 个答案:

答案 0 :(得分:4)

因为等待条件变量是非繁忙的等待。 CPU实际上没有做任何工作。相反,线程处于空闲状态,等待信号。在发出条件信号之前,不会给线程提供任何CPU资源。

当发出条件信号时,线程再次符合条件,并且调度程序可以再次为其分配CPU资源。

将繁忙的等待循环while (!condition)与紧密循环中的旋转进行对比,不断检查condition变量。

循环的原因是条件可能会发出信号,但是在此线程获取之前,其他人可能会锁定。因此,不是通过紧密循环检查条件是否为真,而是有一系列相对较长的非忙等待,每次等待一次测试。

有关详细信息,请参阅Condition Variables