C ++ System V信号量:多个服务器进程,一个客户端进程

时间:2015-01-16 20:07:26

标签: c++ shared-memory semaphore

我有以下场景,我使用单个客户端进程和单个服务器进程,但我不确定如何设计以扩展服务器数量。

注意,在下面的内容中,服务器和单个客户端是进程,而不是线程。我在共享内存中有一个2D 4x4阵列矩阵[0-based,row-major],我希望有几台服务器能够更新给定的指定单元。对角条目总是= 1.因此,例如,为了简单起见,说有三个服务器1,2,3。我想将服务器1分配给始终写入单元[1,0]和服务器2始终写入单元格[2,0]和服务器3以始终写入[3,0]。

客户的工作就是将矩阵从共享内存复制到本地副本,以便尽可能少地阻止编写器。问题是:

在多个服务器和一个客户端的场景中,我是否需要为每个单元设置一个信号量?如果是这样,我如何协调所有服务器,因为只有一个服务器可以一次写入,而[客户端可能是每个单元的多线程一个线程]客户端在本地复制共享矩阵?相反,如果我使用二进制信号量,并且有多个服务器写入共享内存,由于多个服务器和一个客户端共享一个二进制信号量集,所以哪个服务器发出信号以允许写入?我意识到多线程程序,例如actor可能会更好地工作,但我需要服务器是进程而不是线程。

C ++中的一个简单示例就足够了,或者解释也很好。

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用由进程间锁定保护的共享内存。每个进程都需要在访问内存之前绘制锁定图。看一下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)