【问题标题】:How to pass message to a thread如何将消息传递给线程
【发布时间】:2011-09-01 17:40:26
【问题描述】:

我需要编写一种代理服务器,我的设计有点像这样: 1. Socket 服务器(使用 Windows 事件选择模型)。程序有一个监听线程监听网络事件。
2. 客户端列表(当前由socketid索引)。 3. socket server 接受一个新的连接,然后为每个客户端创建一个新的线程。新线程创建到最终目标服务器的套接字连接(需要持久连接)。

我已经编写了套接字服务器并且工作正常。我的问题是当新消息来自客户端时,我如何将此消息传递到相关线程(以便可以将消息发送到目标服务器)。

在我的服务器中,我从客户端消息中获取最终目标服务器的地址。我可以从客户端套接字列表中查找客户端套接字。但是我如何将消息发送到正确的线程?

到目前为止,在我使用的线程中,线程函数只是运行一个循环。我是否调用线程函数,将消息作为参数传递给它?

有人对如何做到这一点有任何好的想法吗?

我能不能只有一个客户端套接字 ID 和目标服务器套接字 ID 的映射。

在客户端套接字上接受后,连接到目标服务器并发送消息。将目标服务器套接字 ID 保存到地图。

此后,当从客户端获取新消息时,在地图中查找目标服务器并将消息发送到所需的服务器套接字。

实际上,我需要让这个多线程吗?

【问题讨论】:

  • 为什么要使用发送线程?只需让接收客户端“消息”的任何线程直接使用传出套接字即可。否则,在不为每个线程使用队列的情况下,没有干净的机制可以将上下文切换到特定线程。

标签: c++ multithreading


【解决方案1】:

使用消息传递或同步原语,例如队列、邮箱、事件信号等。

例如,如果每个线程都有一个用于发送数据的队列,那么您只需写入该队列即可。队列必须是线程安全的,才能允许并发访问。

【讨论】:

    【解决方案2】:

    我将假设每个客户端都需要相同的处理。所以你只需要一堆工作线程。获取连接。获取相关数据(互斥体)。过程。触发响应。

    那么为什么每个客户端都有一个线程。需要时构造一个工作线程。似乎是一个更简单的解决方案。

    【讨论】:

      【解决方案3】:

      基本上,每个线程都需要一个消息队列。然后你可以将传入的数据发布到这个队列中,线程可以依次处理它。

      有很多方法可以实现这样的队列。例如,您可以使用 Windows 消息队列,并将 Windows 消息发布到目标线程拥有的窗口。或者,您可以使用自定义线程安全消息队列来传递数据,数据结构受互斥体保护。

      【讨论】:

        猜你喜欢
        • 2012-01-07
        • 2013-12-17
        • 2012-10-14
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        • 2012-08-02
        相关资源
        最近更新 更多