【问题标题】:How to get a Win32 Thread to wait on a work queue and a socket?如何让 Win32 线程等待工作队列和套接字?
【发布时间】:2009-08-05 18:38:58
【问题描述】:

我需要一个客户端网络线程来响应要传输的新消息,以及接收网络上的新数据。我希望避免该线程执行轮询循环,而是仅在需要时进行处理。

场景如下:

客户端应用程序需要通过大部分但不完全同步的协议与服务器通信。通常,客户端向服务器发送消息并阻塞,直到收到响应。

服务器可能异步处理客户端请求,在这种情况下响应客户端 不是结果,而是处理已开始的通知。当服务器完成对客户端请求的处理后,将在未来某个时间向客户端发送结果消息。

异步结果通知可以随时到达客户端。这些通知需要在收到时进行处理,即只有在客户端再次发送时才能处理积压。

客户端网络线程接收和处理来自服务器的通知,并传输来自客户端的传出消息。

为了实现这一点,我需要在接收到网络数据时或在要传输的消息被排入输入队列时唤醒线程以执行处理。

如何唤醒线程以处理已入队的工作项或来自套接字的数据?

我主要对使用普通的 Win32 API 感兴趣。

非常欢迎提供最小示例或相关教程!

【问题讨论】:

    标签: c++ winapi winsock


    【解决方案1】:

    套接字的 I/O 完成端口的替代方法是使用WSAEventSelect 将事件与套接字关联。然后正如其他人所说,您只需要使用另一个事件(或某种可等待句柄)来发出信号何时将项目添加到您的输入队列中,并使用 WaitForMultipleObjects 等待任何一种事件。

    【讨论】:

    • +1;解决问题,即使它不能很好地扩展(有时我会得到“IOCP 是唯一的解决方案”的心态;)而且通常有更容易实施的解决方案......)。
    【解决方案2】:

    您可以为句柄设置一个 I/O 完成端口,并让您的线程在完成端口上等待:

    实际上,您可以让多个线程在端口上等待(每个处理器一个线程通常效果很好)。

    【讨论】:

    • +1 - Michael 没有说的是,一旦你的套接字 i/o 来自 I/O 完成端口,就没有什么可以阻止你将自己的完成值发布到要处理的端口与您的工作项目。所以你的线程可以唤醒并处理套接字事件或工作项——这几乎就是你所要求的:)
    【解决方案3】:

    根据 Michael 的建议,我有一些免费代码为 IO Completion Port 样式套接字提供了框架;它还包括一个基于 IOCP 的工作队列。你应该可以从here获取一些东西来解决你的问题。

    【讨论】:

      【解决方案4】:

      好吧,如果两个对象都有标准的 Windows 句柄,您可以让您的客户端调用 WaitForMultipleObjects 来等待它们。

      您可能想研究将网络端口的服务拆分到自己的线程上。这可能会大大简化事情。但是,如果您最终不得不在新线程和主线程之间同步其他内容,这将无济于事。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        • 2013-01-19
        相关资源
        最近更新 更多