c++ - 在 C++ 中终止一个分离的线程(从其中)

标签 c++ multithreading sockets terminate

问题是,我在我的服务器上创建了分离线程,它以每个客户端线程的方式工作,因此接受客户端的函数创建另一个监听器函数(作为线程,并将其分离)等待另一个客户加入。

伪代码如下:

Listen to client...
Accept Client Connection...
If client connection is Valid then
Create and detach a thread of the exact same function.
Else
Keep on listening...

我分离线程只是因为之后,创建某个线程的线程正在处理一个客户端,如果该客户端离开所有登录的客户端,那么该客户端将被迫注销(因为有一个线程链):

//-> means creating a thread
Listening thread... Handling Client 1 -> Listening... Handling 2 -> Listening... Handling 3

等等。因此,当客户端 1 的线程终止时,所有其他线程都会终止。

这就是为什么我不能放弃分离(除非我在 main() 中创建线程,显然,但这不是程序的架构)。

现在,问题发生在某人退出而不通知任何事情时,因此线程不会和平结束。我唯一一次注意到客户端不在线是在 recv()send() 返回负值时。当我注意到这一点时,我必须终止线程。

我尝试使用 std::terminate() 这样做,但我收到一个错误窗口,提示 r6010 - abort() 已被调用。

如何在所有服务器不崩溃的情况下终止该线程?

我会被迫更改架构吗?

最佳答案

结束一个线程的方法是从它的线程过程中返回。

如果您希望从深层内部处理代码做出结束决定,则抛出一个由线程过程捕获的异常。与 pthread_exit 相比,这有几个巨大的好处:

  • 发生堆栈展开,因此您的处理代码使用的动态分配不会泄漏(如果正确保存在智能指针中),以及在析构函数中执行的任何其他清理(刷新文件缓冲区等)。

  • 将来如果你想添加重试逻辑或类似的东西,你可以捕获异常。相反,对 pthread_exit 的调用类似于对 std::terminatestd::exit 的调用——当前上下文无条件结束(尽管处理程序可以通过 set_terminate 安装,该处理程序无法取消退出)。可重用代码应该永远强制应用程序级退出。

关于c++ - 在 C++ 中终止一个分离的线程(从其中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29986297/

相关文章:

c++ - 为什么 "reference to array"在 C++ 中以如此困惑的方式定义?

c++ - OpenGL,围绕一个点的旋转仍然围绕原点不起作用

c++ - 如何grep 'vector'而不是 'std::vector'

ios - UIView animateWithDuration 使应用程序在从 dispatch_async block 调用时挂起

c++ - Antlr 4 C++ 目标语法规则返回 lambda,规则引用错误时缺少属性访问

java - java线程等待获取不到锁的状态是什么

c - 多终端多用户应用

c - TCP socket编程中服务端如何判断消息是哪个客户端发送的

linux - 为什么消息在套接字编程中不需要是网络字节顺序?

Java Socket 同步行为