gpt4 book ai didi

c - 上面显示的程序使用 Pthreads API。 LINE C 和 LINE P 处的程序的输出是什么?

转载 作者:行者123 更新时间:2023-11-30 15:17:40 24 4
gpt4 key购买 nike

int value = 0;
void *runner(void *param); /* the thread */

int main(int argc, char *argv[])
{
pid_t pid;
pthread_t tid;
pthread_attr_t attr;

pid = fork();

if (pid == 0) /* child process */
{
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,NULL);
pthread_join(tid,NULL);
printf("CHILD: value = %d\n",value); /* LINE C */
}
else if (pid > 0) /* parent process */
{
wait(NULL);
printf("PARENT: value = %d\n",value); /* LINE P */
}
}

void* runner(void* param)
{
value = 5;
pthread_exit(0);
}

LINE C 处的值是否为 5,而 LINE P 处的值为 0。但这是为什么呢?我认为这是因为子进程是父进程的副本,但子进程中发生的任何更改不一定会在父进程中发生更改。

在子进程中,调用运行程序线程,该线程将值更改为 5,然后将其打印出来。

当子进程完成时,父进程会打印出 0,因为没有对该值执行任何操作。它是否正确?

最佳答案

子进程写入内存同时也会更改父进程内存的唯一情况是写入的内存是显式共享内存。 value 变量是常规变量(不在共享内存中)。子级对其变量的副本执行的任何操作都不会对父级的副本产生任何影响。另一方面,线程确实共享相同的内存空间,因此子线程中的线程会修改子线程主线程可以访问的内存。

请注意,当进程 fork 时,即使父进程是多线程的,子进程也只有一个线程。这不是这个问题的一个因素(线程的使用本质上与获得的结果无关),但是修改代码以使其确实成为一个问题并不困难。

关于c - 上面显示的程序使用 Pthreads API。 LINE C 和 LINE P 处的程序的输出是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32171667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com