【问题标题】:C++ System V semaphore: Multiple server processes, One client processC++ System V 信号量:多个服务器进程,一个客户端进程
【发布时间】:2015-03-15 12:45:11
【问题描述】:

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

注意,服务器和单个客户端是进程,而不是线程。我在共享内存中有一个 2D 4x4 数组矩阵 [0-based,row-major],我希望多个服务器能够更新给定的分配单元。对角线条目始终 = 1。例如,为了简单起见,假设有三个服务器 1、2、3。我想分配服务器 1 始终写入单元格 [1,0] 和服务器 2始终写入单元格 [2,0] 和服务器 3 始终写入 [3,0]。

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

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

一个简单的C++例子就够了,或者解释一下也不错。

【问题讨论】:

    标签: c++ shared-memory semaphore


    【解决方案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)

    【讨论】:

    • 我对你的建议感到困惑。 spsc 是一个单一生产者单一消费者容器。虽然我有一个消费者。明确指出,我需要几个产生结果的过程。我错过了什么吗?
    • 更正,我运行了示例程序,其中有两个进程,一个是推送的,一个是消耗的,它似乎可以工作。我想我的认知失调是因为容器是 SPSC,但不知何故,不止一个生产者可以插入到环形缓冲区中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2016-05-18
    • 2013-10-30
    相关资源
    最近更新 更多