将fork实现转为pthread实现:解决变量值无法同步修改问题
解决fork()变量不共享问题:转用pthread实现
我明白你的问题啦——fork()创建的子进程会获得父进程地址空间的独立副本,所以子进程里修改的value只是自己副本中的值,父进程的原变量完全不受影响,这就是为什么你最后看到父进程输出的还是5。而pthread线程是共享同一进程的地址空间的,所有线程都能直接访问和修改同一个全局变量,正好能解决你的需求。
下面是转换后的pthread实现代码:
#include <stdio.h> #include <pthread.h> int value = 5; // 线程执行的函数 void* child_thread(void* arg) { printf("Entrei no filho! \n"); value += 15; // 线程退出,返回NULL(这里不需要返回值) pthread_exit(NULL); } int main() { pthread_t tid; // 创建线程,指定要执行的函数 int ret = pthread_create(&tid, NULL, child_thread, NULL); if (ret != 0) { perror("Failed to create thread"); return 1; } // 等待子线程执行完成,类似fork里的wait() pthread_join(tid, NULL); // 此时子线程已经修改了value,父线程(主线程)能看到修改后的值 printf("PARENT: value = %d\n", value); return 0; }
关键说明:
- 线程共享地址空间:子线程修改的
value和主线程的是同一个变量,不需要额外的IPC机制就能共享数据。 - pthread_join():和fork里的
wait(NULL)作用类似,确保主线程等待子线程执行完毕后再输出结果,避免主线程先执行输出导致拿到未修改的值。 - 编译注意:编译这段代码时需要链接pthread库,比如用gcc的话:
gcc your_file.c -o your_program -lpthread
如果你的尝试中遇到了具体问题(比如线程创建失败、同步问题等),可以再补充细节,但上面的代码应该能直接解决你原本的变量修改后父进程看不到的问题。
内容的提问来源于stack exchange,提问作者Lucas Urake
相关产品推荐
相关产品推荐

