【发布时间】:2015-02-13 07:13:22
【问题描述】:
在开发基于 VoIP 的应用程序时,我们有一个通用的多线程 C++11 模块。 它在 iOS、MacOS 中运行良好,但在 Android 中发现线程调度困难。
可选的设计说明(仅在感兴趣的情况下)
我很少有使用消息队列运行的线程。
- Master(将数据写入 SSL_Read 队列中接收的套接字)
- SSL_Read(从 SSL 读取数据并在其队列中更新)
- SSL_Write(将数据写入 SSL,直接从 Socket 线程接收)
- 每个套接字线程(从套接字读取数据并发送到 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 个线程的 10 条消息。一世
尝试
yield()1 次和 100 次循环,但没有 的优势。同一线程继续运行。 -
sleep_for()选项与 0 和 100 毫秒相同。相同的线程继续运行。 - 尝试将所有线程的
nice()值更改为 -10、-20,但没有 运气。
如何有效地使用std::this_thread::yield() 而不会烧掉太多的CPU 周期?
【问题讨论】:
-
你为什么使用 yield() 而不是像 condvars/semaphores 这样的普通线程间通信机制?
-
@MartinJames,
std::mutex和notify_all()已被使用。尽管如此,我每隔一段时间都会看到这种行为。
标签: android c++ multithreading c++11 scheduling