如何在多线程环境中处理共享内存?

问题描述 投票:0回答:1

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

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

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

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

我对如何进行毫无头绪。当前,我已经创建了一个共享内存段,服务器上有20个线程,客户端上有10个线程。

c multithreading unix ipc shared-memory
1个回答
0
投票

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

使用相同的线程处理请求一直很容易。这样,您就不必在线程之间传递请求。但是,如果您有一个正在处理的请求池,通常有意义的是让一个线程能够“放下”一个请求,然后再让该线程或其他线程“拾取”该请求。请求。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.