首页 > 解决方案 > 如何在多线程环境中处理共享内存?

问题描述

我有一个客户端-服务器模型。多线程客户端通过 TCP 套接字向服务器发送消息。服务器也是多线程的,每个请求都由工作池中的一个线程处理。

现在,服务器必须通过共享内存 IPC 将消息发送回客户端。例如:

multi threaded client --- GET /a.png --> server
                                          |
                                          |
                                       one worker
                                          |
                                          |
                                         \ /
                       puts the file descriptor into the shared memory  

当工作线程将信息添加到共享内存中时,我如何确保它被请求它的同一个客户端读取?

我对如何继续感到无能为力。目前,我已经创建了一段共享内存,服务器上有20个线程,客户端有10个线程。

标签: cmultithreadingunixipcshared-memory

解决方案


虽然您可以在线程之间使用 IPC,但这通常不是一个好主意。无论如何,线程共享所有内存,因为它们是同一进程的一部分,并且线程之间有非常有效的通信机制。

让同一个线程一直处理请求可能会更容易。这样,您不必在线程之间传递请求。但是,如果您有一个正在处理的请求池,那么让一个线程能够“放下”一个请求,然后再让该线程或另一个线程“拿起”请求通常是有意义的。要求。

最简单的方法是让与请求相关的所有信息都存在于单个结构或对象中。使用标准线程同步工具(如互斥锁)来控制查找对象、获取对象的所有权等。

因此,当 I/O 线程接收到请求时,它会创建一个新的请求对象,获取一个互斥体,并将其添加到服务器正在处理的请求的全局集合中。工作线程可以检查这个全局集合以查看哪些请求需要工作,或者它们可以由创建请求的线程显式分派。


推荐阅读