gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:45 26 4
gpt4 key购买 nike

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

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

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

  1. Master(将数据写入 SSL_Read 队列中接收的套接字)
  2. SSL_Read(从 SSL 读取数据并更新其队列)
  3. SSL_Write(将直接从 Socket 线程接收的数据写入 SSL)
  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. 我决定在消息队列运行时使用 std::thread::yield()填写超过一定限度;例如来自 1 个线程的 10 条消息。我在循环中尝试了 yield() 1 次和 100 次,但是没有利用它。同一线程继续运行。
  2. 对于具有 0 和 100 毫秒的 sleep_for() 选项也是如此。同一线程继续运行。
  3. 尝试将所有线程的 nice() 值更改为 -10、-20 但没有运气。

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

最佳答案

std::this_thread::yield() 什么都不做是合法的。它为调度程序提供了调度另一个线程的机会;调度程序不必利用它。

你可以试试:

  1. 通过将工作打包到通用任务队列中,让每个线程能够处理需要做的任何工作。这样,哪个线程执行工作并不重要,最重要的工作只有在有线程执行时才能完成。

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

关于android - 如何确定性地使用 std::this_thread::yield() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27479842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com