【问题标题】:Semaphores for different parts of the same shared memory block in CC中同一共享内存块的不同部分的信号量
【发布时间】:2015-06-24 16:31:03
【问题描述】:

我有一个关于如何为我的程序设置共享内存段的问题。

在我的程序中,我希望有一个包含 50 个不同帐户的主要结构。 看起来像这样的东西。

struct list{
   struct account[50];
};

在每个帐户中只有一些基本信息

struct account{
   int x;
   char * y;
};

现在,我希望我的整个列表位于共享内存段中,因为我的主进程的不同子进程将更新列表中的不同帐户。

但是,我只希望子进程能够访问此列表中的某个帐户。我将如何设置一个可以被不同部分的子进程锁定的共享内存段?例如,我想要一个可以锁定对共享内存段中帐户 [32] 的访问的信号量。这意味着另一个进程可以同时更新共享内存段中的帐户[29],没有问题。

我并不是真的在寻找具体的代码示例(尽管那些会有帮助),而是更多地了解为该程序设置共享内存的最佳方法。

谢谢。

【问题讨论】:

    标签: c memory multiprocessing semaphore shared-memory


    【解决方案1】:

    如果我理解这是什么意思,我会看到两种选择:

    第一个是修改struct account,所以多了一个字段,一个信号量。任何进程在访问其他帐户的字段之前都应在信号量上P(),并在完成后V()

    第二种是修改struct list,添加一个额外的信号量数组,与帐户数组的大小相同,为数组中的每个信号量分配相同索引的帐户,并使用P()V()在访问相应帐户之前和之后再次访问它。

    【讨论】:

    • 在这两种情况下,您都应该非常小心虚假共享(在同一缓存行中有多个信号量)。您可以添加一些填充来避免这种情况。
    • 是的,我认为这可行。但是,我还想要一种方法,每 30 秒读取一次帐户中的所有信息并打印出来,而不管某个进程当前是否正在更新帐户。如果我希望这种情况发生,哪种方法会更好?我如何快速将控制权从子进程(更新帐户)转移到父进程,父进程应该在那个时间点打印出所有帐户的所有信息?或者我不需要转移控制权并且可以让父进程一直查看这个共享内存段。谢谢
    • @JesterKynes:我不确定我是否理解关于传输控制的部分,但我想在更新时没有其他进程应该能够访问该帐户,否则会有什么意义完全同步?
    • 所以我希望能够一次锁定整个列表结构,以获得一种可以打印其所有信息的方法。如果这次要更新帐户,如何将共享内存的控制权转移到打印信息功能,然后在打印信息功能完成后将其转移回更新帐户功能。换句话说,我想我想要两层授权。如果列表当前被打印功能锁定,我希望所有正在更新的帐户都被锁定,直到打印功能完成。然后我想解锁帐户
    • @JesterKynes:如果要对整个数据集进行快照,则需要锁定整个数据集。您可以获取每个信号量,也可以创建共享读/写锁。要从数据集中读取,进程必须获得读锁。要写入数据集中的任何位置,该进程必须在整个数据集上获得一个写锁。如果您不这样做,您将无法确保获得列表的视图,因为它存在于任何时刻。如果您这样做,您应该删除单个数据元素的信号量。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多