在开发基于VoIP的应用程序时,我们有一个通用的多线程C ++ 11模块。 它在iOS,MacOS中工作正常,但在Android中发现线程调度难度。
我有几个线程与消息队列一起运行。
1-2是相关的,3-4是相关的 我观察到在许多调用期间,只有2个线程正在运行,而其他2个线程没有运行时间。由于观察到哪条单向语音路径。
我怀疑这是一个Android Linux问题,为此,我有一个未答复的帖子:
c++11 multithreading issues with Android where some threads are not scheduled properly。
经过std::this_thread::yield() usage?
目标是为所有线程提供类似的时间切片。尝试以下选项:
std::thread::yield()
填补超出一定限度;例如来自1个线程的10条消息。一世
尝试yield()
1次和100次循环,但没有
它的优点。同一个线程继续运行。sleep_for()
选项的内容与0和100毫秒相同。同一个线程继续运行。nice()
值更改为-10,-20但不是
运气。如何在不消耗太多CPU周期的情况下有效使用std::this_thread::yield()
?
答案 0 :(得分:5)
std::this_thread::yield()
绝对不做任何事情是合法的。它为调度程序提供了安排另一个线程的机会;调度程序不必利用它。
您可以尝试:
通过将工作打包到通用任务队列中,让每个线程都能够处理任何工作需要做的事情。这样,哪个线程可以完成工作并不重要,当有一个线程可以完成时,最重要的工作就完成了。
在线程之间添加同步,例如屏障机制(参见例如boost的屏障类),以保持所有4个线程同步。