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

标签 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)被认为更有效 然后只需使用无限全局变量循环,例如:

while (!condition);

(在我看来)它们都在忙着等待变量条件变为真,唯一的区别是 cond 循环还检查是否有不同的线程“发出信号”给 cond 变量。

最佳答案

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

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

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

循环的原因是条件可能已发出信号,但在该线程获取锁之前锁可能被其他人占用。因此,您有一系列相对较长的非繁忙等待,而不是一个紧密的循环来检查条件是否为真,每个等待后跟一个测试。

参见 Condition Variables了解更多详情。

关于c - 'busy-wait'无限循环和条件验证无限循环的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969200/

相关文章:

c++ - 从这些字符串的图像中提取字符串?

c - Getchar() 不起作用?

java - JVM 无法在 Cloud Foundry 中创建线程

opengl - glReadPixels 和 alpha channel 返回 1.0

c++ - SDL_opengl_glext.h 的用途是什么?

c - 使用 memcpy 后尝试获取数据的段错误 11

c++ - 如何在C/C++中设置获取互斥量的优先级

java - 将数据库连接与 Netty 4 事件执行器的线程相关联

java - 处理 ForkJoinPool 任务/操作中未捕获异常的更好方法

c - 如何像 SDL_Mixer 那样播放多种声音,但在 SDL2 中是原生的?