Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建多个C++;不使用join()阻塞主线程的线程? 我有一个C++的简单TCP客户机/服务器,我现在正在生成一个线程,每个连接的用户处理消息,但是我遇到了一些问题,我不知道如何解决它们,因为我不熟悉标准的C++线程。_C++_Multithreading - Fatal编程技术网

如何创建多个C++;不使用join()阻塞主线程的线程? 我有一个C++的简单TCP客户机/服务器,我现在正在生成一个线程,每个连接的用户处理消息,但是我遇到了一些问题,我不知道如何解决它们,因为我不熟悉标准的C++线程。

如何创建多个C++;不使用join()阻塞主线程的线程? 我有一个C++的简单TCP客户机/服务器,我现在正在生成一个线程,每个连接的用户处理消息,但是我遇到了一些问题,我不知道如何解决它们,因为我不熟悉标准的C++线程。,c++,multithreading,C++,Multithreading,当客户机连接到服务器时,将为该客户机创建一个线程,直到使用类似于 clientThread = thread(processMessages); clientThread.join(); 此线程将在客户端的生命周期内保持。正如我在此线程上调用的join(),当客户端2连接而客户端1仍处于连接状态时,join()调用会阻止它 删除此join()调用意味着,当客户端断开连接时,线程将被破坏,导致终止()错误,因为它是可连接的 如何让这个客户端线程在后台处理,而主线程可以继续并接受新的连接 仅显示如

当客户机连接到服务器时,将为该客户机创建一个线程,直到使用类似于

clientThread = thread(processMessages);
clientThread.join();
此线程将在客户端的生命周期内保持。正如我在此线程上调用的join(),当客户端2连接而客户端1仍处于连接状态时,join()调用会阻止它

删除此join()调用意味着,当客户端断开连接时,线程将被破坏,导致终止()错误,因为它是可连接的


如何让这个客户端线程在后台处理,而主线程可以继续并接受新的连接

仅显示如何存储创建的
线程
对象:

std::vector<std::thread> threads;
threads.emplace_back(processMessages);
...
for (auto & t : threads) t.join();
std::向量线程;
线程。向后放置(processMessages);
...
对于(自动&t:线程)t.join();

但是,正如其他人在评论中指出的那样,为每个新连接创建线程可能不是最好的方法。

使用
detach()
而不是
join()
。噢,哇,谢谢,完全忽略了这一点。我不推荐:-/。可能是更好的建议。在这种情况下使用
detach
有点像建议某人切断手臂以防止蚊子叮咬。这里的大问题是“为每个连接的用户生成一个线程”,这是众所周知的工作效率低下的问题。我的建议是查找类似ASIO的东西,它可以以合理合理、可扩展的方式处理您的问题。如果您真的想自己做,请创建一个线程池和一个由线程池处理的请求队列。这可以大大减少开销。如果您在创建后立即加入,那么首先创建线程就没有多大意义了。如果您正在创建一个新的
线程
,您可能希望并行或异步地执行工作。因此,在工作线程工作时,执行主线程需要执行的任何操作,并且只有在实际需要知道
线程
已完成时,才使用
连接