【问题标题】:How to schedule this multiple thread application?如何调度这个多线程应用程序?
【发布时间】:2011-12-29 06:13:55
【问题描述】:

让我们举个例子..

一些复杂的工作被4个线程分割

thread -A is calling function_A
thread -B is calling function_B
thread -C is calling function_C
thread -D is calling function_D

现在的条件是线程 A、B、C 可以同时工作,但是当线程 D 正在执行 function_D 时,它会看到来自 A、B、C 的任何线程是否正在那里执行函数?如果是,那么它将等待它们完成,当没有来自 a、b、c 的线程正在执行该函数时,线程 D 将开始执行函数 D。

我该怎么做?有什么好主意吗?

编辑:function_A,function_B,function_c 使用一个句柄。并且 function_D 正在关闭该句柄。当任何函数使用该句柄时,它不应该被 function_d 关闭。

【问题讨论】:

  • 如果您想了解更多关于使用信号量的知识(除了使用下面的答案),您可能需要阅读“信号量小书”greenteapress.com/semaphores

标签: c++ c linux multithreading operating-system


【解决方案1】:

这听起来像是计数信号量的工作。

每个使用句柄的线程都应该增加信号量值。线程 D 应该等待信号量达到零。

如果你在不关心线程 D 何时运行的情况下实现这一点,如果线程 D 在 A、B 或 C 之前运行并立即关闭句柄,请不要感到惊讶。

【讨论】:

  • 我怎样才能让线程 d 在信号量 0 上等待?我知道 sem_wait() 但不能以这种方式使用它
  • @Mr.32:您可能需要使用semop 和朋友。它们比sem_wait 更复杂,并且有更多选择。
【解决方案2】:

您需要自己同步这些线程,操作系统不会保证任何同步。
最简单的方法是使用 Semaphores 或条件变量。

【讨论】:

  • @Mr.32:看看维基百科链接。它用一个简单的例子解释了这个概念。简而言之,信号量只不过是一个共享计数器,您可以使用跨线程来同步它们.
【解决方案3】:

您应该查看有关同步控制的信息。

取决于您的设计,有很多方法可以实现这种行为:

  1. 线程 A-C 在运行前获取自己的互斥体/临界区,线程 D 在运行前获取其所有互斥体。

  2. 有一个计数信号量为 3。线程 A-C 获取信号量一次,而线程 D 获取该信号量 3 次

  3. 利用读写锁,线程 A-C 获取读取锁,而线程 D 获取写入锁

等等……

这一切都取决于您的设计,而您是这里唯一知道哪种策略在您的设计中最合理的人。

【讨论】:

  • 精湛的答案..我要使用信号量
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多