C++ System V 信号量:多个服务器进程,一个客户端进程
C++ System V semaphore: Multiple server processes, One client process
我有以下场景,我使用单个客户端进程和单个服务器进程,但我不确定如何设计以扩展服务器数量。
注意,后面的服务器和单客户端是进程,不是线程。我在共享内存中有一个 2D 4x4 数组矩阵 [0-based, row-major] 我希望多个服务器能够更新给定的分配单元格。对角线条目始终 = 1。例如,为了简单起见,假设有三台服务器 1、2、3。我想分配服务器 1 始终写入单元格 [1,0],以及服务器 2始终写入单元格 [2,0] 和服务器 3 始终写入 [3,0].
客户端的工作只是将矩阵从共享内存复制到本地副本,以便尽可能少地阻塞编写器。问题是:
在这种多服务器和一个客户端的情况下,我是否需要为每个单元格设置一个信号量?如果是这样,我该如何协调所有服务器,因为一次只能写入一个服务器,而 [客户端可能是每个单元一个线程的多线程] 客户端在本地复制共享矩阵?相反,如果我使用二进制信号量,并且有多个服务器写入共享内存,那么哪个服务器被发出允许写入的信号,因为多个服务器和一个客户端共享一个二进制信号量集? 我意识到例如演员的多线程程序可能会更好,但我需要服务器是进程而不是线程。
一个简单的C++例子就够了,或者解释一下也很好。
一个简单的解决方案是使用受进程间锁保护的共享内存。每个进程在访问内存之前都需要绘制锁图。看看boost库中的共享内存和进程间锁。
http://www.boost.org/doc/libs/1_57_0/doc/html/interprocess.html
http://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/synchronization_mechanisms.html
http://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/sharedmemorybetweenprocesses.html
这里有一个很好的例子:
Shared-memory IPC synchronization (lock-free)
我有以下场景,我使用单个客户端进程和单个服务器进程,但我不确定如何设计以扩展服务器数量。
注意,后面的服务器和单客户端是进程,不是线程。我在共享内存中有一个 2D 4x4 数组矩阵 [0-based, row-major] 我希望多个服务器能够更新给定的分配单元格。对角线条目始终 = 1。例如,为了简单起见,假设有三台服务器 1、2、3。我想分配服务器 1 始终写入单元格 [1,0],以及服务器 2始终写入单元格 [2,0] 和服务器 3 始终写入 [3,0].
客户端的工作只是将矩阵从共享内存复制到本地副本,以便尽可能少地阻塞编写器。问题是:
在这种多服务器和一个客户端的情况下,我是否需要为每个单元格设置一个信号量?如果是这样,我该如何协调所有服务器,因为一次只能写入一个服务器,而 [客户端可能是每个单元一个线程的多线程] 客户端在本地复制共享矩阵?相反,如果我使用二进制信号量,并且有多个服务器写入共享内存,那么哪个服务器被发出允许写入的信号,因为多个服务器和一个客户端共享一个二进制信号量集? 我意识到例如演员的多线程程序可能会更好,但我需要服务器是进程而不是线程。
一个简单的C++例子就够了,或者解释一下也很好。
一个简单的解决方案是使用受进程间锁保护的共享内存。每个进程在访问内存之前都需要绘制锁图。看看boost库中的共享内存和进程间锁。
http://www.boost.org/doc/libs/1_57_0/doc/html/interprocess.html http://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/synchronization_mechanisms.html http://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/sharedmemorybetweenprocesses.html
这里有一个很好的例子: Shared-memory IPC synchronization (lock-free)