我编写了一个相当简单的程序,它通过使用进程找到前 N 个质数(N 作为命令行参数提供)。共享内存段用于经过验证的素数数组、正在考虑的当前候选数以及迄今为止获得的结果数(与 N 进行比较以确定何时停止)。信号量用于避免多个进程访问 3 个共享内存段的问题。
我最近使用线程和互斥锁实现了同样的程序,而且麻烦少了很多。考虑到这一点,我知道我的素数算法是有效的。事实上,当前使用进程和信号量的程序大部分都能正常工作。
但是,可以提供一个可选的命令行参数来指定要使用的进程数。这在程序的线程版本中是直截了当的。然而,这一次,我有一个全局 sembuf 结构,它包含向上和向下数组,其元素等于正在使用的进程数。现在我将它们都静态设置为 3(默认值)并且程序按预期工作;但是,我无法弄清楚如何使用不同数量的向上和向下数组元素大小动态创建这些 sembufs 以说明不同的进程号(因为结构是全局的)。
我了解如何使用 malloc 动态分配数组大小(如此处概述:Set array size at runtime),但它们是结构的一部分似乎是个问题。这是我的简单 sembuf(如果有用的话):
// Sembuf struct for semaphore information.
struct sembuf down[SLAVES], up[SLAVES];
其中 SLAVES 是协调质数调查的派生进程的数量。它目前在默认值 3(或我手动定义 SLAVES 的任何其他值)下工作,但动态设置这些值是我的目标。
任何有关如何做到这一点的想法,或实现类似结果的不同策略,将不胜感激。
最佳答案
你目前有这样的事情,对吧?
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);
它的使用方式与您目前的使用方式完全相同。
关于c - 在C中动态创建sembuf结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26817769/