【问题标题】:Ensure that each thread gets a chance to execute in a given time period using C++11 threads确保每个线程都有机会使用 C++11 线程在给定的时间段内执行
【发布时间】:2017-05-22 07:05:21
【问题描述】:

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

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

最好,我也想保证每个线程都是实时调度的。

万一除了依赖操作系统别无他法,Linux有什么解决办法吗?

可以这样做吗?怎么样?

【问题讨论】:

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


    【解决方案1】:

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


    但是,仍然有一些函数可以标记操作系统,表明特殊线程/进程非常重要,因此您可以根据自己的目的影响这个时间模糊。

    您可以获取平台相关线程句柄以使用操作系统功能。

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

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

    我只是想再次声明,这需要每个平台都有不同的实现!


    微软视窗

    根据Microsoft documentation

    SetThreadPriority 函数

    设置指定线程的优先级值。这个值,一起 用线程进程的优先级类决定 线程的基本优先级。


    Linux/Unix

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

    如需更多信息,请查看thisstackoverflow 问题(std::thread 应与this 相同)。

    【讨论】:

    • 谢谢。在那种情况下,有没有办法在 Linux 中标记操作系统?
    • 谢谢。但是,该链接涉及 pthreads,而我对 C++11 线程感兴趣
    • 确实如此,但在 Linux 系统上 std::thread 应该是一个 pthread。
    • @ArthurM。 - 好吧,也许是“应该”,但它不需要是 pthread。实际要求是native_handle() 是否存在是实现定义的,如果确实存在,你可以对结果做什么是实现定义的。所以这里没有什么可移植的,即使对于使用不同编译器针对同一操作系统编译的程序也是如此。
    • @Peter Becker 根据 C++11 的规范,本机句柄始终存在。是的,我确实知道,我也说过,这个句柄对于每个平台都是不同的。但是,关于 Linux 的情况实际上并不取决于 pthread。链接显示它依赖于Linux系统当前的线程调度。 PS,对于那种情况,我说std::thread 应该是Linux下的pthread
    【解决方案2】:

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

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

    如果您可以拥有一个可以在不相互排斥的情况下执行的任务队列,而不是让每个线程执行自己的任务,而不是让长寿命的线程执行 - 您可以拥有一个任务队列和一个线程池出列并执行任务。

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

    【讨论】:

    • 谢谢。没看懂If instead of having long living threads each doing its own task you can have a single queue of tasks that can be executed without mutual exclusion - you can have a queue of tasks and a thread pool dequeuing and executing tasks.能详细点吗?
    • 您说您希望它向用户显示就好像任务同时发生一样。为此,您有执行这些任务的线程。但这不是实现这一目标的唯一方法。相反,您可以将您的任务放在一个队列中,并让线程去队列工作并执行它。然后,为了确保事情看起来是同时发生的,您需要: 1. 确保任务不会花费太长时间来完成。 2.有足够多的线程执行任务。 3. 任务可以在没有互斥的情况下完成——这意味着没有锁会阻止其他等待获取锁的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多