问题是,我已经分离了在我的服务器上创建的线程,它以每个客户端线程的方式工作,所以接受客户端的函数,创建另一个侦听器函数(作为线程,并分离它),等待另一个客户端加入。
在伪代码中如下所示:
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() has been called.
如何在不使所有服务器崩溃情况下终止线程?
我会被迫改变架构吗?
发布于 2015-05-05 00:42:44
结束线程的方法是从线程过程返回。
如果您希望在内部处理代码中做出结束决策,则抛出一个由线程过程捕获的异常。与pthread_exit相比,这有几个巨大的好处
pthread_exit的调用类似于对std::terminate或std::exit的调用--当前上下文无条件地结束(尽管可以通过set_terminate安装处理程序,但该处理程序不能取消退出)。可重用代码永远不应强制应用程序级退出。发布于 2015-05-01 21:17:34
我认为你需要在你的客户端通信循环中测试一个变量,这个变量向线程发出何时返回的信号:
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
}
}
};https://stackoverflow.com/questions/29986297
复制相似问题