【问题标题】:How to use std::this_thread::yield() deterministically?如何确定性地使用 std::this_thread::yield()?
【发布时间】:2015-02-13 07:13:22
【问题描述】:

在开发基于 VoIP 的应用程序时,我们有一个通用的多线程 C++11 模块。 它在 iOS、MacOS 中运行良好,但在 Android 中发现线程调度困难。

可选的设计说明(仅在感兴趣的情况下)

我很少有使用消息队列运行的线程。

  1. Master(将数据写入 SSL_Read 队列中接收的套接字)
  2. SSL_Read(从 SSL 读取数据并在其队列中更新)
  3. SSL_Write(将数据写入 SSL,直接从 Socket 线程接收)
  4. 每个套接字线程(从套接字读取数据并发送到 SSL_Write 队列)

1-2 相关,3-4 相关。
我观察到,在许多调用期间,只有 2 个线程正在运行,而其他 2 个线程没有运行时间。因此,观察到 1 路语音路径。

问题

我怀疑这是一个 Android Linux 问题,为此,我已经有一个未答复的帖子:
c++11 multithreading issues with Android where some threads are not scheduled properly
经过std::this_thread::yield() usage?

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

  1. 我决定在消息队列为 超过一定限度的装满;例如来自 1 个线程的 10 条消息。一世 尝试yield() 1 次和 100 次循环,但没有 的优势。同一线程继续运行。
  2. sleep_for() 选项与 0 和 100 毫秒相同。相同的线程继续运行。
  3. 尝试将所有线程的 nice() 值更改为 -10、-20,但没有 运气。

如何有效地使用std::this_thread::yield() 而不会烧掉太多的CPU 周期?

【问题讨论】:

  • 你为什么使用 yield() 而不是像 condvars/semaphores 这样的普通线程间通信机制?
  • @MartinJames,std::mutexnotify_all() 已被使用。尽管如此,我每隔一段时间都会看到这种行为。

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


【解决方案1】:

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

你可以试试:

  1. 通过将工作打包到通用任务队列中,让每个线程都能够处理需要做的任何工作。这样,无论哪个线程负责工作,最重要的工作都会在有线程来完成时完成。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多