【问题标题】:How a child thread can kill another child thread of same process in cpp [duplicate]子线程如何在cpp中杀死同一进程的另一个子线程[重复]
【发布时间】:2021-01-23 08:28:25
【问题描述】:

假设我们有父线程 Tp,它以相同的顺序启动两个子线程 Tc1 和 Tc2,并等待 Tc2 加入 (Tc2.join())。

Tc2:它通过调用 shell 启动并等待用户输入。 Tc1:它启动并运行一个时间计数器,如果用户在 Tc2 子线程中没有输入,它会在指定时间后停止由 Tc2 启动的 shell。

现在的问题是父线程一直处于等待Tc2加入的状态,进程仍然挂起。

Tc1如何终止Tc2(处于用户输入等待状态)以便父线程Tp可以继续?

浏览了很多,但无法突破。

【问题讨论】:

  • 终止线程是迟早会导致进程死锁的可靠方法。你需要重新考虑你的方法。 “调用sh​​ell”背后的原因:这是一个外部进程还是从std::cin读取的循环?
  • 使用“readline”读取用户输入。
  • @Tony:我的用例是监控会话是否空闲,即在一定时间间隔内没有用户输入,然后在主线程 Tp 中继续关闭会话。
  • 啊,这是一个 XY 问题!请参阅how to make readline timeout,以及我的其他评论中的select 建议。下次,请提前给我们更多背景信息,以便我们更好地帮助您。
  • 现在我已经浏览了 readline 文档,您还可以设置 rl_done,或者只是向 Tc2 线程发送 SIGINT 信号。

标签: c++ linux multithreading


【解决方案1】:

尽管某些操作系统允许线程暴力终止,但这几乎总是一个坏主意。这是因为线程共享内存,而您不知道线程在终止时正在做什么。很有可能发生死锁、内存泄漏和崩溃。

您需要的是一种在方便时要求线程自行终止的方法。最简单的模式是线程轮询原子isRunning 变量。更复杂的模式将涉及使用poll 在多个文件描述符中等待。其中之一可以是eventdfd 或简单的信号管道。当您希望线程关闭时,您向线程发出信号,然后它会自行关闭。

【讨论】:

  • 做或多或少类似的事情,但如上所述,问题是 Tc2 处于等待用户输入的状态,父线程 Tp 正在等待 Tc2 加入。
  • 在标准输入上使用 poll 然后使用 read 来获取击键。
猜你喜欢
  • 2011-06-28
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
相关资源
最近更新 更多