【问题标题】:Scheduling tasks in multithreads多线程调度任务
【发布时间】:2012-12-12 16:42:57
【问题描述】:

我正在尝试在多线程系统中安排任务。我的想法是每个线程都有一个本地队列,每个线程将从其本地队列中获取作业。但是当线程达到某个阈值时,它不应该获取作业,而是应该将作业转移到低于阈值级别的线程。

我的疑问是如何设置线程的阈值。

【问题讨论】:

  • 这里没有足够的信息来回答您的问题。对于初学者,您尚未指定您正在使用的平台或编程语言,我不知道您所说的“阈值”是什么意思。
  • 我正在 Microsoft Visual Studio 中研究 C++ 编程语言。并且阈值在某种意义上,当一个线程非常繁忙时,它不应该再获取作业,而是应该将作业转移到另一个空闲的线程。这有助于线程之间的负载平衡。我的问题是如何设置线程不再接受作业的限制。
  • 如果还不清楚请告诉我,谢谢
  • 我可以监控线程堆栈使用情况是否很好..!!如果线程长时间使用 100% 的堆栈内存。我认为它很忙,它不应该接受任何新任务。请帮助我,我对这些主题不熟悉

标签: c++ multithreading scheduling task-queue job-scheduling


【解决方案1】:

解决此问题的另一种安排是让已完成队列的线程能够从其他队列中获取工作。这就是众所周知的“工作窃取”,是一种众所周知的调度算法,例如

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.8905

【讨论】:

  • 是的,我知道任务窃取,但这种方法开销更大,延迟也更大......!我提出的想法会降低两者,但我在实施时有这些疑问
  • 我不太确定我是否理解“工作窃取”与“工作委派”(您的模式)所涉及的额外延迟和开销。你能解释一下吗?
  • 工作窃取有时会导致“代价高昂的远程窃取”,比如线程 1 空闲而线程 8 忙,我猜从第 1 到第 8 个线程窃取会增加延迟。
  • 你能解释一下“昂贵的远程窃取”吗?
  • 在不同芯片上的内核之间进行窃取会导致更高的开销成本、额外的冷缓存未命中、远程内存访问成本以及由于错误共享导致的一致性未命中,从而降低了性能。工作窃取的另一个限制是它不能充分利用内核之间共享的缓存。
【解决方案2】:

你用的是什么线程库?

我在所有线程项目 TBB 和 Cilk Plus 中都使用了两个 OSS 库。这些更高级别的运行时提供的一个特性是它们以一种有效利用处理器资源的方式自动将任务调度到线程上。运行时在负载平衡许多任务方面也非常有效。

www.threadingbuildblocks.org

www.cilkplus.org

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2021-06-13
    相关资源
    最近更新 更多