如何确定性地使用std :: this_thread :: yield()?

时间:2014-12-15 08:17:21

标签: android c++ multithreading c++11 scheduling

在开发基于VoIP的应用程序时,我们有一个通用的多线程C ++ 11模块。 它在iOS,MacOS中工作正常,但在Android中发现线程调度难度。

可选设计说明(仅在感兴趣时)

我有几个线程与消息队列一起运行。

  1. Master(将数据写入SSL_Read队列中接收的套接字)
  2. SSL_Read(从SSL读取数据并在其队列中更新)
  3. SSL_Write(将数据写入直接从套接字线程接收的SSL)
  4. 每个套接字的线程数(从套接字读取数据并发送到SSL_Write队列)
  5. 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?

    目标是为所有线程提供类似的时间切片。尝试以下选项:

    1. 我决定在消息队列时使用std::thread::yield() 填补超出一定限度;例如来自1个线程的10条消息。一世 尝试yield() 1次和100次循环,但没有 它的优点。同一个线程继续运行。
    2. sleep_for()选项的内容与0和100毫秒相同。同一个线程继续运行。
    3. 尝试将所有线程的nice()值更改为-10,-20但不是 运气。
    4. 如何在不消耗太多CPU周期的情况下有效使用std::this_thread::yield()

1 个答案:

答案 0 :(得分:5)

std::this_thread::yield()绝对不做任何事情是合法的。它为调度程序提供了安排另一个线程的机会;调度程序不必利用它。

您可以尝试:

  1. 通过将工作打包到通用任务队列中,让每个线程都能够处理任何工作需要做的事情。这样,哪个线程可以完成工作并不重要,当有一个线程可以完成时,最重要的工作就完成了。

  2. 在线程之间添加同步,例如屏障机制(参见例如boost的屏障类),以保持所有4个线程同步。