c - 如何在多线程环境中处理共享内存?
问题描述
我有一个客户端-服务器模型。多线程客户端通过 TCP 套接字向服务器发送消息。服务器也是多线程的,每个请求都由工作池中的一个线程处理。
现在,服务器必须通过共享内存 IPC 将消息发送回客户端。例如:
multi threaded client --- GET /a.png --> server
|
|
one worker
|
|
\ /
puts the file descriptor into the shared memory
当工作线程将信息添加到共享内存中时,我如何确保它被请求它的同一个客户端读取?
我对如何继续感到无能为力。目前,我已经创建了一段共享内存,服务器上有20个线程,客户端有10个线程。
解决方案
虽然您可以在线程之间使用 IPC,但这通常不是一个好主意。无论如何,线程共享所有内存,因为它们是同一进程的一部分,并且线程之间有非常有效的通信机制。
让同一个线程一直处理请求可能会更容易。这样,您不必在线程之间传递请求。但是,如果您有一个正在处理的请求池,那么让一个线程能够“放下”一个请求,然后再让该线程或另一个线程“拿起”请求通常是有意义的。要求。
最简单的方法是让与请求相关的所有信息都存在于单个结构或对象中。使用标准线程同步工具(如互斥锁)来控制查找对象、获取对象的所有权等。
因此,当 I/O 线程接收到请求时,它会创建一个新的请求对象,获取一个互斥体,并将其添加到服务器正在处理的请求的全局集合中。工作线程可以检查这个全局集合以查看哪些请求需要工作,或者它们可以由创建请求的线程显式分派。
推荐阅读
- symfony - 从 twig 内的 node_module 导入一个 js 文件
- python - 设置matplotlib表的单元格颜色并保存为图形?
- c# - 在 C# 中使用哪个 http 客户端来获取、发布和下载带有进度跟踪的文件?
- typescript - 属性或方法“foo”未在实例上定义,但在渲染期间被引用。确保此属性是反应性的
- javascript - 如何在 VM 中运行代码,同时限制对除指定全局变量之外的所有全局变量的访问
- java - 使用 iterator().next() 从 HashSet 获取任何元素是否比从 LinkedHashSet 获取它们慢?
- android - 我的第二个应用程序在尝试与第一个应用程序一起安装时出现错误 910
- javascript - 表格无法进一步发展,似乎陷入了困境
- ionic-framework - 数据存储样式绑定
- asp.net - 非开发人员如何管理作为 asp.net mvc 核心应用程序一部分的静态 html 文件?