【问题标题】:Best way to terminate a thread from inside the thread or any other safe way从线程内部终止线程的最佳方式或任何其他安全方式
【发布时间】:2020-09-10 13:49:21
【问题描述】:

背景: 所以我正在编写一个基于网络的应用程序。应用程序有一部分线程无限循环并执行一些操作,还有其他线程在收到新请求时开始运行(P.S. 这些是预先生成的线程)。

所以,现在的问题是:这些线程大多使用静态数据,我还没有遇到需要动态分配一些资源的情况。 所以这些线程使用的是静态数据,当用户想要关闭程序或者程序接收到终止信号时,我想以安全的方式终止线程。

那么在内部终止线程的最佳方式或任何其他安全方式是什么

我知道声明全局变量是不好的,即使它们是原子的或东西。

谢谢。

P.S:我对基于 POSIX 或 C++11 线程的解决方案没有任何帮助。

【问题讨论】:

  • 如果你的线程从来没有副作用,你为什么要运行它们呢?如果它们确实有副作用,那么终止它们怎么可能是安全的,除非它们的副作用是完全原子的并且不能被中断以导致程序的不变量被破坏?
  • 我明白你在说什么@EOF,相应地编辑了问题,我看到我的线程确实有一些副作用,从外部终止它们是不安全的。谢谢。
  • 我会说这取决于。你的线程在做什么?等待 I/O(在这种情况下,它们不应该是线程,而是 I/O 应该通过 I/O 多路复用来完成)?如果它们主要是在计算,那么它们需要多久与其他线程交互以获得输入或传递输出?在最坏的情况下,它们完全受 CPU 限制,并且没有可以同步轮询信号的自然等待点。在这种情况下,您可能必须使用完全异步的信号,并且必须确保发出信号的线程优雅地终止而不会造成损坏。
  • 一般来说,线程是一个糟糕的抽象。尝试考虑 I/O 多路复用和任务。 Futures/promise 可能有助于合理地组织程序,尤其是在它们可以异步取消的情况下。
  • 我同意“它取决于”部分。但就我而言,我想线程是必不可少的,因为涉及到多个客户端,并且有一个主套接字将 newclientsockfd 推送到消息队列(这使用 IO Mux),然后由预生成的线程占用以进行通信,这可能需要很长时间,因此对于多个客户端连接,我猜线程将是正确的选择。另外关于改用任务,我还没有探索任务。我现在就去阅读它们。谢谢你的建议。但是有什么与这种特殊情况的良好做法有关的吗?

标签: c multithreading c++11 networking posix


【解决方案1】:

既然您已经有办法为正在运行的线程(FD)提供某种工作,为什么不添加一种方法给它一个“停止”命令?

【讨论】:

  • 现在让我介绍 2 个线程池,一个线程池根据它们从消息队列中选择的任何内容执行工作,而另一个线程池无限期地执行相同的任务,而不管对程序的任何其他更改。我们如何告诉其他线程池终止?也只是看看转换。与@EOF
  • "indefinitely" 应该替换为某种“直到”,因此您应该有一个可变条件,而不是“while(true)”。如果您不想使用全局变量,您可以在线程创建 void * 参数中在父线程和子线程之间传递某种引用。
  • 这对于安全退出来说是可能的,但是如果程序接收到终止信号,我们不能改变引用变量,因此会导致突然终止
  • 对于某些信号,您无法做任何“好的退出”,但是如果您指的是 SIGTERM,它可能会被捕获并以您喜欢的任何方式“解释”。
  • 是的,您是对的,但是对于可以捕获的信号,您能否建议一些方法来终止不涉及任何全局变量的线程。
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多