通知所有活动线程(Windows)



我面临一个关于c++、Windows中线程同步的设计问题。

我正在编写一个服务器应用程序,该应用程序启动一个侦听线程,该线程应该在服务器启动时始终保持活动状态。当监听线程收到connect请求时,它打开一个CONTROL套接字并启动一个新的控制线程。该线程用于在服务器和客户端之间发送控制数据,初始化服务器和所有后台软件以指定客户端数据并开始数据处理。

如果初始化(通过控制套接字)成功,控制线程将打开一个新的套接字,DATA套接字,然后用于将数据从服务器传递到客户端。它还将启动两个新线程,一个在这个新的DATA套接字上发送,另一个在CONTROL套接字上接收,等待客户端是否想要终止连接。

当客户端不正常地终止连接时,通过终止应用程序而不调用发送服务器消息关闭连接的函数,应该发生以下情况:

    任何正在执行的线程都可以检测到此事件。它们在发送或接收DATA/CONTROL套接字时将得到某种错误(WSAECONNRESET),然后应该向所有其他线程发出信号,要求它们停止执行(服务器侦听线程除外)。

实现这种行为最自然的方式是什么?

(我使用winsock (winsock2.h)进行网络连接,使用标准的windows api (windows.h)进行线程处理)

如果您正在编写一个多线程的winsock服务器,您应该查看IO完成端口。使用IO完成端口是在windows平台上编写网络服务的最具可伸缩性的方式。

基于IO完成端口的winsock服务器使用异步通信,所以不是在套接字上阻塞,而是在发生有趣的事情时接收完成数据包。

在任何情况下,您都将使用WSARecv。当WSARecv返回非零时,调用WSAGetLastError()。如果您没有WSA_IO_PENDING,那么打开错误并查找您感兴趣的winsock错误代码。

winsock错误码WSA_OPERATION_ABORTED表示套接字已经关闭,尽管还有其他错误码(例如WSAECONNABORTED)。

我会建议一个关于这个主题的好的文本(例如Windows via C/c++)。

您可以使用WSAEventSelect()函数将事件对象与套接字关联,并为您的事件创建一个事件对象,然后在WaitForMultipleObjects()函数中使用这些事件对象,因此您的线程可以等待套接字事件和您的自定义事件。

最新更新