首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定地使用std::this_thread::yield()?

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

Stack Overflow用户
提问于 2014-12-15 08:17:20
回答 1查看 678关注 0票数 3

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

可选的设计描述(仅在感兴趣的情况下)

我有几个线程在运行消息队列。

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

1-2是相关的,3-4是相关的。

我观察到,在许多调用过程中,只有两个线程在积极运行,而其他两个线程没有运行时间。由于该单向语音路径被观察到。

问题

我怀疑这是Android Linux的问题,为此,我已经有了一个未回答的帖子:

c++11 multithreading issues with Android where some threads are not scheduled properly

通过了thread::yield() usage?

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

  1. 当消息队列超过一定的限制时,我决定使用std::thread::yield();例如,来自一个线程的10条消息。我尝试了yield() 1次和100次循环,但没有优势。同一线程继续运行。
  2. 对于0和100 ms的sleep_for()选项也是一样的。同一线程继续运行。
  3. 尝试将所有线程的nice()值更改为-10、-20,但没有结果。

如何在不消耗太多CPU周期的情况下有效地使用std::this_thread::yield()

EN

回答 1

Stack Overflow用户

发布于 2014-12-15 09:01:35

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

你可以试一试:

  1. 让每个线程能够处理任何需要做的工作,方法是将工作打包到一个通用任务队列中。这样,哪个线程接受工作并不重要,最重要的工作是在有线程完成时完成。
  2. 在线程之间添加同步,例如屏障机制(参见boost的屏障类),以使所有4个线程保持同步。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27479842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档