我有 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.
}
}
}
最佳答案
子进程不与其父进程共享变量。对 fork 子进程执行此操作的唯一方法是专门创建和映射共享内存以保存值。
一个更合理的方法是使用线程而不是子进程,但似乎您被分配给您的任务困住了。在这种情况下,我会推荐如下内容:
int *x = mmap(0, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
在 fork 之前,然后在子进程中递增 *x
...
但是!
现在您必须处理同步问题。按原样,您很容易在输出中丢失或重复数字。查找 POSIX 进程共享的互斥锁,让您开始朝着那个方向前进......
关于c - 在 Linux 中从子进程修改全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061578/