在服务器应用程序的情况下,是截断线被视为良好,中性或设计差的线程
In the case of a server application, is detatching threads considered good, neutral, or poor design
我最近使用Winsock使用在线指南编写了一个简单的TCP服务器。然后,我尝试在没有指南的帮助下进行多线程。经过一段时间的挣扎,我最终取得了成功,但只有脱离线程。
我有一个无限的环路,每当accept()
返回SOCKET
时,它会创建Handler
,并在accept()
的SOCKET
结果中调用handle()
。这是handle()
函数,它从accept()
调用中获取套接字,并创建调用processData
的线程:
void Handler::handle(SOCKET socket)
{
std::thread handlerThread([socket]{
processData(socket);
});
}
这是实际的processData
函数,它是Handler
中的静态函数:
void Handler::processData(SOCKET socket)
{
try
{
const int buffLength = 512;
char recvBuff[buffLength];
int recvResult = recv(socket, recvBuff, buffLength, 0);
if(recvResult > 0)
{
std::cout << recvBuff << std::endl;
}
closesocket(socket);
}
catch(std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}
此代码将在recv()
上使用代码R6010的abort()
以某种方式逃脱了try-catch。直到我将handle
功能更改为
void Handler::handle(SOCKET socket)
{
std::thread handlerThread([socket]{
processData(socket);
});
handlerThread.detach();
}
它能够通过recv()
调用。
如果有人可以解释为什么分离线程会对recv()产生影响,并且知道如果有更期望的设计模式,您不必脱离工作人员线程,如果您与我分享,我将非常感谢。
如果这太具体了,则可以在上发表您的意见。 来自规格: 30.3.1.3线程驱动器[thread.thread.destr] 〜thread(); 如果Joinable(),请调用std :: terminate()。否则,没有效果。 在您的第一种情况下,当 我个人试图避免脱离线程。因此,在您的情况下,我更喜欢线程池,或者您通过将其存储在矢量中来跟踪线程对象。 正如@mkaes已经回答的那样,只要线程不脱离,它就在线程对象的上下文中起作用,因此当对象被破坏时会停止。 就线程而言,我要么使用临时线程或静态线程。通常,在服务器上,不应停止静态线程,因此可以分离。对于临时线程,您要么想要一些结果,因此您必须在某个时候加入它们,或者您不这样做,因此可以分离。 线程的问题通常可以优雅地结束您的应用程序。如果您拥有独立的线程,这将更加困难,因为即使您发出信号要停止,您也需要额外的机制来找出所有线程是否已经结束(即使那样,您也永远不会100%确定),所以这似乎是主要的避免脱离线程的原因。handle
返回时,当您的线程对象在堆栈上时,destructor被调用。由于您的底部线程仍在运行并在recv
功能中被阻塞std::terminate()
。最终导致abort()
调用。
当您分离线程时,您可以破坏std::thread
对象,因为它不再可加入。
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- Vulkan默认情况下已经有多线程了吗
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- 如何在没有同步的情况下使用多个线程(2、4,8、16 个线程)在循环(10,100、1000 个周期)中打印字符串?
- 如何在不复制列表的情况下将列表传递给线程,同时销毁原始列表
- 在不减慢线程速度的情况下保存大量数据
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
- 如何改进此代码以便在多线程环境下运行
- 多线程模式下的SQLite3:执行到底不安全
- C/C++分配器在多线程环境下的性能如何
- 如何使用c++在没有读线的情况下显示字符串中的多个单词
- 多线程环境下,其他线程永远无法访问临界区
- Log4cplus api在多线程环境下崩溃
- 多线程环境下的Rocksdb
- 来自回溯的堆栈跟踪未显示导致多线程环境下崩溃的方法
- 多线程环境下的执行时间
- 如何在多线程环境下安全地访问结构字段