【发布时间】: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