如何确定性地使用 std::this_thread::yield()
How to use std::this_thread::yield() deterministically?
在开发基于VoIP的应用程序时,我们有一个通用的多线程C++11模块。它在iOS,MacOS中运行良好,但在Android中发现线程调度困难。
可选设计说明(仅当有兴趣时(
我很少有线程使用消息队列运行。
- 主(将数据写入队列中接收SSL_Read套接字(
- SSL_Read(从 SSL 读取数据并更新其队列(
- SSL_Write(将数据写入直接从套接字线程接收的SSL( 每个套接字
- 的线程数(从套接字读取数据并发送到SSL_Write队列(
1-2 是相关的,3-4 是相关的。
我观察到在许多调用期间,只有 2 个线程在活动运行,其他 2 个线程没有运行时间。因此观察到 1 路语音路径。
问题
我怀疑这是Android Linux的问题,为此,我已经有一篇未回答的帖子:
Android 的 c++11 多线程问题,其中某些线程未正确调度。
通过标准::this_thread::yield((使用?
目标是为所有线程提供类似的时间切片。已尝试以下选项:
- 我决定
std::thread::yield()
在消息队列填满超过一定限度;例如,来自 1 个线程的 10 条消息。我循环尝试yield()
1 次和 100 次,但没有它的优势。同一线程继续运行。 - 对于 0 和 100 毫秒
sleep_for()
选项也是如此。 - 尝试将所有线程
nice()
值更改为 -10、-20,但没有运气。
如何在不消耗太多 CPU 周期的情况下有效地使用std::this_thread::yield()
?
std::this_thread::yield()
什么都不做是合法的。它为调度程序提供了调度另一个线程的机会;调度程序不必利用它。
您可以尝试以下任一方法:
-
通过将工作打包到通用任务队列中,使每个线程能够处理需要执行的任何工作。这样,哪个线程承担工作并不重要,当有线程要做时,最重要的工作就会完成。
-
在线程之间添加同步,例如屏障机制(参见 boost 的屏障类(,以保持所有 4 个线程同步。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- C++错误:"error: int aaa::bbb is protected within this context"
- 在std::thread中,joinable()然后join()线程安全吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 关于C++中具有多重继承"this"指针的说明
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 分离一个静态常量 std::thread?
- 在noexcept 规范中是否允许使用"this"?
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何从 std::thread 返回值
- C++调用具有 *this 属性的单个帮助程序函数
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- Doees the 'this' 指针参与虚函数的多态行为
- 在 c++ 中正确定义"this"关键字?
- std::thread,在"this"上启动线程(从类本身内部)