【问题标题】:Dynamically create sembuf structure in C在 C 中动态创建 sembuf 结构
【发布时间】:2014-11-08 13:46:40
【问题描述】:

我编写了一个相当简单的程序,它通过使用进程来查找前 N 个素数(N 作为命令行参数提供)。共享内存段用于已验证的素数数组、正在考虑的当前候选数以及迄今为止获得的结果数量(与 N 进行比较以确定何时停止)。信号量用于避免多个进程访问 3 个共享内存段时出现问题。

我最近使用线程和互斥锁实现了同样的程序,它的麻烦要少得多。考虑到这一点,我知道我的素数算法有效。事实上,当前使用进程和信号量的程序大部分都可以工作。

但是,可以提供一个可选的命令行参数来指定要使用的进程数。这在程序的线程版本中是直截了当的。然而,这一次,我有一个全局 sembuf 结构,其中包含 up 和 down 数组,其元素等于正在使用的进程数。现在我将它们都静态设置为 3(默认值)并且程序按预期工作;但是,我无法弄清楚如何使用不同数量的向上和向下数组元素大小动态创建这些 sembuf,以解决不同的进程号(因为结构是全局的)。

我了解如何使用 malloc 动态分配数组大小(如此处所述:Set array size at runtime),但它们是结构的一部分似乎是一个问题。这是我的简单 sembuf(如果有用的话):

// Sembuf struct for semaphore information.
struct sembuf down[SLAVES], up[SLAVES];

其中 SLAVES 是协调质数调查的衍生进程的数量。它目前在默认值 3(或我手动定义 SLAVES 的任何其他值)下工作,但动态设置这些值是我的目标。

任何关于如何做到这一点的想法,或实现类似结果的不同策略,将不胜感激。

【问题讨论】:

    标签: c struct semaphore


    【解决方案1】:

    你现在有这样的,对吧?

    struct Whatever
    {
        ...
        struct sembuf down[SLAVES], up[SLAVES];
        ...
    };
    

    您应该将其转换为:

    struct Whatever
    {
        ...
        size_t slaves;
        struct sembuf *down, *up;
        ...
    };
    

    然后你用 malloc() 初始化它:

    Whatever whatever;
    whatever.slaves = 100;
    whatever.down = malloc(sizeof(struct sembuf) * whatever.slaves);
    whatever.up = malloc(sizeof(struct sembuf) * whatever.slaves);
    

    它的使用方式与您目前使用的方式完全相同。

    【讨论】:

    • 有道理!我认为我将另一个问题的示例扩展得不够远。我会试一试,但我相信它会奏效。感谢您的帮助!
    • 只是为了确认,这就是我一直在寻找的。花了 30 秒的时间来解决我一直在思考的问题,大约 90%。再次感谢您的帮助。干杯!
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多