【问题标题】:Terminate threads Gracefully in ACE在 ACE 中优雅地终止线程
【发布时间】:2011-02-14 14:49:57
【问题描述】:

我有一个类似于 This one 的问题。 但我想在 Linux 中使用 ACE 框架来实现它。这样做的方法是什么

【问题讨论】:

标签: c++ linux ace


【解决方案1】:

更多信息将有助于获得更好的答案:

  • 您的工作线程是否在运行之前等待其他事件?
  • 您的线程如何相互通信?
  • 您是否始终能够正常终止,或者您是否预计必须强制终止某些线程?

你提到的other question提出了一个很好的观点:

通常,线程终止的方式只是从定义线程的函数返回。通常,主线程使用事件对象或简单的整数或布尔值通知工作线程退出。如果工作线程在 WaitForSingleObject 中等待,您可能需要将其更改为 WaitForMultipleObjects,其中一个对象是一个事件。主线程调用SetEvent,工作线程唤醒并返回。

根据您在 ACE 中的设置,您可以使用从主线程到工作线程的进程间通信来告诉它们停止,它们会在下一次事件检查时获取并处理。或者,你可以使用linux的select

希望这会为您指明正确的方向。

【讨论】:

  • 我目前处于设计阶段。我的子线程一旦开始执行,它们需要定期运行以执行一些工作,并且它们还需要等待来自父线程的触发器(窗口中的事件)。此事件包括终止。无论如何,这是在 Windows 中。我在 ACE 2 中识别类似接口时发现困难。只有父线程需要与子线程通信 3。是的,我们总是有能力优雅地终止你提到的另一个问题正是我需要的使用 ACE 实现。你能推荐我在 ACE 中类似的界面吗
  • 免责声明:我自己没有使用过 ACE,我更喜欢 Boost。如果我正确理解您的问题,则不一定是 ACE 问题。在 Linux 中,您需要类似于 Windows 事件的东西,例如使用套接字和选择(请参阅linux.die.net/man/2/select_tut)。 ACE 的任务类(参见第 5.5 节cs.wustl.edu/~schmidt/PDF/ACE-concurrency.pdf)还提供了一个可以用来替换事件的消息队列。另一种选择是使用 ACE 条件。底线是:有多种解决方案都使用 ACE 和本机 linux 调用。看看哪一个最适合您的需求。
  • @resehen 我的感觉是套接字、选择和消息队列基本上用于需要一些 IO 或数据传输时。并且 ACE 或 linux 条件变量有些奇怪,因为我需要为每个相应的事件设置一个条件变量,并且使用具有互斥锁的相同条件变量的多个线程效率低下。也许我应该使用 ACE 线程管理器 ACE_Thread_Manager::instance ()->cancel_all () 来终止每个线程中的所有线程和 ACE 事件处理程序,以便它们可以定期运行。
  • 我查看了 ACE_Thread_Manager 文档,并且 cancel_all() 似乎正是您正在寻找的(如果您需要在特定的情况下杀死工人,cancel() 还可以提供更细粒度的控制)命令)。我也同意你关于套接字对于你需要的东西很重以及无数条件变量效率低下的结论。听起来您正朝着正确的方向前进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 2011-01-04
相关资源
最近更新 更多