确保每个线程都有机会使用C ++ 11线程在给定时间段内执行

时间:2017-01-07 16:57:01

标签: c++ multithreading c++11 scheduling

假设我在C ++ 11中有一个多线程程序,其中每个线程控制向用户显示的内容的行为。

我想确保在给定程序的一个线程运行的每个时间段IBDesignable中,每个线程都有机会至少执行T时间,以便显示看起来好像所有线程同时执行。我们的想法是根据存储在线程中的一些信息,建立一个循环调度机制,使用时间共享,迫使线程在其时间片结束后等待,而不是依赖于操作系统调度程序。

最好,我还想确保每个线程都是实时安排的。

如果除了依赖操作系统之外没有别的办法,Linux有什么解决方案吗?

有可能这样做吗?怎么样?

2 个答案:

答案 0 :(得分:4)

这不是C ++ 11线程不可能跨平台的。调用线程的频率和持续时间不适用于应用程序。它取决于您正在使用的操作系统。

但是,仍有一些函数可以用来标记特殊线程/进程非常重要的操作系统,因此您可以将此时间模糊化为您的目的。

您可以获取与平台相关的线程句柄以使用OS功能。

native_handle_type    std::thread::native_handle //(since C++11)
  

返回实现定义的底层线程句柄。

我只想再次声明,这需要针对每个平台实施不同的建议!

Microsoft Windows

根据Microsoft documentation

  

SetThreadPriority函数

     

设置指定线程的优先级值。这个价值在一起   用线程的优先级进程确定   线程的基本优先级。

的Linux / Unix

对于Linux来说,事情变得更加困难,因为有不同的系统可以如何安排线程。在Microsoft Windows下,它使用优先级系统,但在Linux上,这似乎不是默认的安排。

有关详细信息,请查看this stackoverflow问题(std::threadthis}而应该相同。

答案 1 :(得分:1)

  

我想确保在给定程序的一个线程运行的每个时间段T内,每个线程都有机会执行至少时间t,以便显示看起来好像所有线程都在执行同时进行。

您正在使用线程使其看起来好像同时执行不同的任务。出于Arthur的回答中所述的原因,我不建议这样做,我真的无法添加任何内容。

如果不是让每个生存线程都执行自己的任务而是拥有一个可以在不相互排斥的情况下执行的单个任务队列 - 您可以拥有一个任务队列和一个线程池队列和执行任务。

如果你不能,你可能想要研究等待免费的数据结构和算法。在无等待的算法/数据结构中,保证每个线程以有限(甚至指定)的步数完成其工作。我可以推荐“多处理器编程的艺术”一书,其中详细讨论了这个主题。它的要点是:每个无锁算法/数据结构都可以通过在线程之间添加通信来修改为等待自由,线程将在其上工作以确保没有其他线程被饿死/停止。基本上,更喜欢所有线程的总吞吐量的公平性。根据我的经验,这通常不是一个很好的妥协。