c - 在 Linux 中从子进程修改全局变量

标签 c concurrency

我有 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/

相关文章:

c - 当我尝试向结构添加数据时程序崩溃

C++11 原子库 std::compare_and_exchange 语义

javascript - 为什么我的 Promise 没有同步运行?

Java 锁定数组范围

java - 启动多个线程并在所有子线程完成后在父线程上运行 callabck 的非阻塞方法

c - 如何查看 ruby​​ c 扩展回溯信息

c - 如何检查 C 中的字符串是否为空(到目前为止没有任何效果)

c - 错误 : "expected ' (' before string constant"

java - ScheduledThreadPoolExecutor + setXXXXShutdownPolicy()

c++ - malloc 的奇怪问题