在Linux中修改子进程的全局变量

我来自C#背景,我在C中的并发性有点困难。我不会骗你…这是我必须为学校做的项目的一部分。 虽然我从事过高级语言的专业工作,但是我的高级论文教授把我们推到了公共汽车下面,强迫整个class级用C编码(我们大多数人都没有经验…… :()。

无论哪种情况,回到问题。 我有一个全局整数变量(从0开始),需要同时增加5个进程,直到它达到100(相当于100%)。

基本上发生的事情是,不是单独修改completionCounter而是每个子进程正在复制它…

是否存在lock(object)或C#中可用的类型? 我尝试使用二进制信号量,但我无法让它工作,我还没有使用共享内存。

 const int THREADCOUNT = 5; int completionCounter = 0; int main(int argc, char **argv) { int count = 0; pid_t pid; for(count = 0; count<THREADCOUNT; count++) { if( (pid = fork()) < 0 ) { //error... return -1; } else if( pid == 0 ) { //child; while(completionCounter != 100 ) { printf("[%i] process downloading data chunk...", getpid()); //do stuff here completionCounter += 5; } } else { //parent. } } } 

子进程不与父进程共享变量。 使用分叉子进程执行此操作的唯一方法是通过专门创建和映射共享内存来保存值。

一个更合理的方法是使用线程而不是子进程,但似乎你仍然坚持你给出的赋值。 在这种情况下,我会建议像:

 int *x = mmap(0, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 

在分叉之前,然后在子进程中递增*x

但!

现在你必须处理同步。 按原样,您的输出中很容易丢失或重复数字。 查找POSIX进程共享的互斥锁,以帮助您开始这个方向…

你是绝对正确的,使用信号量可以实现你想要的。 试试man 3 sem_wait ,那里有一个例子。

这不是由争用问题引起的,而是在创建新进程时(使用fork时会发生这种情况),会创建一个新的内存空间副本。 这实际上意味着您正在创建5个completionCounter – 每个进程一个。 如果您希望所有内容共享相同的内存空间,请查看使用pthreads 。