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

android– 如何确定性地使用std :: this_thread :: yield()?,第1张

概述在开发基于VoIP的应用程序时,我们有一个通用的多线程C11模块.它在iOS,MacOS中运行良好,但在Android中发现线程调度难度.可选设计说明(仅在感兴趣时)我有几个线程与消息队列一起运行.>Master(将数据写入SSL_Read队列中接收的套接字)>SSL_Read(从SSL读取数据并在其队列中更新)

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

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

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

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

1-2相关,3-4相关.
我观察到在许多调用期间,只有2个线程正在运行,而其他2个线程没有运行时间.由于观察到哪种单向语音路径.

问题

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

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

>我决定在消息队列使用时使用std :: thread :: yIEld()
填补超出一定限度;例如来自1个线程的10条消息.一世
试过yIEld()1次,循环100次,但没有
它的优点.同一个线程继续运行.
> sleep_for()选项的内容与0和100毫秒相同.相同的线程继续运行.
>尝试将所有线程的nice()值更改为-10,-20但不是
运气.

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

解决方法:

std :: this_thread :: yIEld()绝对没有任何作用是合法的.它为调度程序提供了安排另一个线程的机会;调度程序不必利用它.

你可以试试:

>通过将工作打包到通用任务队列中,让每个线程都能够处理任何工作需要.这样,哪个线程完成工作并不重要,当有线程执行时,最重要的工作就完成了.
>在线程之间添加同步,例如屏障机制(参见例如boost的屏障类),以保持所有4个线程同步.

总结

以上是内存溢出为你收集整理的android – 如何确定性地使用std :: this_thread :: yield()?全部内容,希望文章能够帮你解决android – 如何确定性地使用std :: this_thread :: yield()?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存