如何将消息传递给线程

时间:2011-08-31 21:44:30

标签: c++ multithreading

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

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

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

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

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

我不仅可以拥有客户端套接字ID和目标服务器套接字ID的映射。

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

从此,当从客户端获取新的消息时,在map中查找dest服务器并将消息发送到必需的服务器套接字。

实际上,我是否需要制作这种多线程?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我将假设每个客户端都需要相同的处理。所以你需要的只是一堆工作线程。获得连接。拿起相关数据(互斥)。处理。解雇响应。

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