Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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++ 多线程-断开TCP连接_C++_Windows_Multithreading_Tcp - Fatal编程技术网

C++ 多线程-断开TCP连接

C++ 多线程-断开TCP连接,c++,windows,multithreading,tcp,C++,Windows,Multithreading,Tcp,我在一个阻塞套接字上创建一个线程来接收数据,它等待数据包到达。但是,当我尝试断开与主线程的连接时,线程之间会出现争用情况,从而导致错误 在这里,切换发生在线程之间的第5行,而没有实际完成断开连接调用 void Disconnect() { if(isConnected) { if (closesocket(sockClient) != SOCKET_ERROR) { isConnected = false; } } } 我

我在一个阻塞套接字上创建一个线程来接收数据,它等待数据包到达。但是,当我尝试断开与主线程的连接时,线程之间会出现争用情况,从而导致错误

在这里,切换发生在线程之间的第5行,而没有实际完成断开连接调用

void Disconnect() {
    if(isConnected) {
        if (closesocket(sockClient) != SOCKET_ERROR) {
            isConnected = false;
        }
    }
}

我应该如何避免开关并让它优雅地完成断开连接呼叫?

以下是两种可能的解决方案

您可以隔离套接字(非主)线程中的所有套接字访问,而不是将套接字从主线程断开,而是让该线程向需要断开连接(或某些其他操作)的非主线程发出信号。这将需要您的辅助线程在两个对象上等待—套接字和指示需要断开连接的信号器(比如Win32)

另一方面,如果希望允许主线程断开连接(就像现在这样),则需要检查使用套接字的所有代码,并使用锁保护使其线程安全,以确保阻止对套接字和相关状态数据的并发访问。有合适的锁,您可以在这里使用,否则您可以将自己的锁实现为Win32之类的包装器

第二种可能是我首选的解决方案——您提出这个问题的事实意味着您需要回头考虑设计中的线程安全性。即使您使用上面的第一个想法,您仍然可能需要保持状态,以避免从主线程发送多个断开连接信号,并且必须对其进行锁保护。此外,如果您希望非主线程处理除“断开连接”之外的传入事件,则必须在线程之间管理关联状态


我认为,从现在开始,阻力最小的方法是在现有代码中添加锁定。确保锁的作用域尽可能窄-例如,不要在任何套接字调用中设置一个锁,该锁可能会阻塞或花费很长时间。

在次线程中,我有一个无休止的while循环调用receive()来检查消息,在该receive调用中有一个阻塞recv()在等待消息。当它在套接字上等待时,我如何向它发送信号?您可以在
WaitForSingleObject(terminateEvent)
上使用一个循环,并始终保持异步接收。正如我所指出的,这是第二种方法可能不那么痛苦的另一个很好的原因。我在Disconnect()的开始和结束处设置了SetEvent()和ResetEvent(),并在一段时间内(WaitForSingleObject(terminateEvent,0)=WAIT_TIMEOUT)检查锁,而不是布尔值isConnected。这是可行的,但我想这就是你的真正意思。