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

时间:2011-02-21 01:53:30

标签: c concurrency

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

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

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

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

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.
        }
    }    
}

3 个答案:

答案 0 :(得分:2)

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

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

int *x = mmap(0, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
在分叉之前

,然后在子进程中递增*x ...

BUT!

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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