首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中终止分离的线程(从线程中)

在C++中终止分离的线程(从线程中)
EN

Stack Overflow用户
提问于 2015-05-01 19:48:16
回答 2查看 2.1K关注 0票数 2

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

在伪代码中如下所示:

代码语言:javascript
复制
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...

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

代码语言:javascript
复制
//-> means creating a thread
Listening thread... Handling Client 1 -> Listening... Handling 2 -> Listening... Handling 3

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

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

现在,当有人在没有通知任何事情的情况下退出时,问题就发生了,所以线程不会平静地结束。我唯一注意到客户端不在线的情况是当recv()send()返回负值时。当我注意到这一点时,我必须终止线程。

我尝试使用std::terminate()执行此操作,但得到一个错误窗口,显示r6010 - abort() has been called.

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

我会被迫改变架构吗?

EN

回答 2

Stack Overflow用户

发布于 2015-05-05 00:42:44

结束线程的方法是从线程过程返回。

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

  • 堆栈展开发生,所以处理代码使用的动态分配不会泄露(如果正确地保存在智能指针中),以及在析构函数中执行的任何其他清理(刷新文件缓冲区等)。
  • 将来如果你想添加重试逻辑或类似的东西,你可以捕获异常。相反,对pthread_exit的调用类似于对std::terminatestd::exit的调用--当前上下文无条件地结束(尽管可以通过set_terminate安装处理程序,但该处理程序不能取消退出)。可重用代码永远不应强制应用程序级退出。
票数 1
EN

Stack Overflow用户

发布于 2015-05-01 21:17:34

我认为你需要在你的客户端通信循环中测试一个变量,这个变量向线程发出何时返回的信号:

代码语言:javascript
复制
class ClientComms
{
    // set to true when you want the thread to stop
    std::atomic_bool done;

public:
    ClientComms(): done(false) {}

    void operator()()
    {
        while(!done)
        {
             // communicate with client
        }
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29986297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档