2017-10-19 184 views
0

我在写一个基于C++的多线程聊天服务器。如何销毁线程对象

当新客户端加入时,主线程创建一个新线程来管理客户端。

我想在客户端断开连接时销毁线程,所以我正确地设置了这个功能,以便当客户端发送退出消息Terminate()被调用时。

但Terminate(),而不是销毁只是单个线程,它销毁了所有的线程。

应该做什么,以便只有我想销毁的线程被销毁?

+1

嗯。通常,线程从主函数返回时结束。 – Scheff

+0

你确定这是你想要的设计吗?这是后来的可扩展性问题的秘诀 –

+0

@David Hamim我正在为12年级计算机科学项目制作这个项目。 因此,可扩展性和效率并不是我关心的问题,因为我自己对自己的水平非常高级(课程大纲是C++基础知识,类,数据处理和链接列表堆栈和队列。) – Vedant

回答

2

你不必做任何特别的事情。

std::thread在构造函数中获得一个可调用的参数,而callable是线程运行的函数。

如果这个callable在某个点结束,分离的线程可以自行清理。 只要确保

  • 退出客户端处理功能,当客户端断开
  • 拆卸螺纹

一个简单的设计,可与此类似:

while(server.is_on()){ 
    auto client = server.acccept_client(); 
    std::thread thread([client = std::move(client)]{ 
    handle_client_until_disconnection(client); 
    }); 
    thread.detach(); 
} 

另一种方法是使用线程池。该线程池在应用程序启动时构建,并在应用程序退出时销毁。

+0

Thankyou @David Hamim – Vedant