c - 当两个线程同时休眠时,什么会产生这种奇怪的行为?

标签 c multithreading opengl

有两个线程。一个是事件线程,另一个负责渲染。渲染线程使用事件线程中的变量。有互斥锁,但它们是无关紧要的,因为我注意到即使我完全删除它们(用于测试),行为也是相同的。

如果我单独在渲染线程中执行 sleep() 10 毫秒,FPS 通常为 100。

如果我在渲染线程中根本不 sleep 并且在事件线程中 sleep ,则渲染线程根本不会减慢。

但是,如果我在渲染线程中休眠 10 毫秒,在事件线程中休眠 10 毫秒,则 FPS 不是 100,而是更低,约为 84! (请注意,即使完全删除互斥锁,它也是一样的)

(如果他们都没有 sleep ,它通常会变高。)

什么会导致这种行为?

--

使用的 sleep 命令是windows的Sleep()或SDL_Delay()(在windows上可能最终是Sleep())。

最佳答案

我相信我已经找到了答案(自己的答案)。

sleep 不能保证等待一段时间,但由于操作系统调度,它会至少等待一段时间。

更好的方法是显式计算实际传递的时间(并且仅当已经过了特定时间时才允许通过该时间执行)。

关于c - 当两个线程同时休眠时,什么会产生这种奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787051/

相关文章:

c++ - 在 opengl c++ 中计算顶点法线(gouraud 着色)

c - OpenGL C - 我将如何从行星上绘制一条线迹?

c - perf - 获取 CPI 值的方法

c - 为什么这个程序打印出带有奇怪字符的字符串?尽管释放内存泄漏?

c++ - Qt 信号/槽和线程

opengl - 在 OpenGL 3.2 中绘制全屏四边形的最佳方法是什么?

c - 是否可以比较 C 中同一变量的字符串?

VS2012 中的 c++11 线程/互斥锁实现 - 触发断言

c - 如果在 linux 中花费的时间超过阈值时间,如何终止子线程

opengl - 是否不再需要双缓冲