发信号通知所有活动线程(Windows)

时间:2011-08-05 11:42:33

标签: c++ windows multithreading synchronization

我遇到了有关C ++,Windows中线程同步的设计问题。

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

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

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

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

实现此类行为的最自然方式是什么?

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

2 个答案:

答案 0 :(得分:0)

如果您正在编写多线程winsock服务器,那么您应该查看IO完成端口。使用IO完成端口是在Windows平台上编写网络服务的最具扩展性的方法。

基于IO完成端口的winsock服务器使用异步通信,因此在发生一些有趣的事情时,线程池不会阻塞套接字,而是接收完成数据包。

无论如何,您将使用WSARecv。当WSARecv返回非零时,请调用WSAGetLastError()。如果您没有WSA_IO_PENDING,请启用错误并查找您感兴趣的winsock error code

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

建议关于这个主题的好文章(例如,通过C / C ++的Windows)。

答案 1 :(得分:0)

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