在开发基于VoIP的应用程序时,我们有一个通用的多线程C 11模块.
它在iOS,MacOS中运行良好,但在Android中发现线程调度难度.
可选设计说明(仅在感兴趣时)
我有几个线程与消息队列一起运行.
> Master(将数据写入SSL_Read队列中接收的套接字)
> SSL_Read(从SSL读取数据并在其队列中更新)
> SSL_Write(将数据写入SSL,直接从Socket线程接收)
>每个套接字的线程数(从套接字读取数据并发送到SSL_Write队列)
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但不是
运气.
如何有效地使用std :: this_thread :: yield()而不会烧掉太多的CPU周期?
解决方法:
std :: this_thread :: yield()绝对没有任何作用是合法的.它为调度程序提供了安排另一个线程的机会;调度程序不必利用它.
你可以试试:
>通过将工作打包到通用任务队列中,让每个线程都能够处理任何工作需要.这样,哪个线程完成工作并不重要,当有线程执行时,最重要的工作就完成了.
>在线程之间添加同步,例如屏障机制(参见例如boost的屏障类),以保持所有4个线程同步.