在C中动态创建sembuf结构

时间:2014-11-08 13:46:40

标签: c struct semaphore

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

我最近使用线程和互斥锁实现了同样的程序,而且麻烦要少得多。考虑到这一点,我知道我的素数算法有效。实际上,当前使用流程和信号量的程序在很大程度上起作用。

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

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

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

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

非常感谢任何有关如何做到这一点的想法,或者采取不同的策略来实现类似的结果。

1 个答案:

答案 0 :(得分: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);

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