【发布时间】:2020-11-10 05:00:14
【问题描述】:
我正在关注有关pthread 和fork 的指南,但我对以下代码的工作方式感到困惑。
以下代码来自https://github.com/angrave/SystemProgramming/wiki/Pthreads%2C-Part-2%3A-Usage-in-Practice
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
static pid_t child = -2;
void *sleepnprint(void *arg) {
printf("%d:%s starting up...\n", getpid(), (char *) arg);
while (child == -2) {sleep(1);} /* Later we will use condition variables */
printf("%d:%s finishing...\n",getpid(), (char*)arg);
return NULL;
}
int main() {
pthread_t tid1, tid2;
pthread_create(&tid1,NULL, sleepnprint, "New Thread One");
pthread_create(&tid2,NULL, sleepnprint, "New Thread Two");
child = fork();
printf("%d:%s\n",getpid(), "fork()ing complete");
sleep(3);
printf("%d:%s\n",getpid(), "Main thread finished");
pthread_exit(NULL);
return 0; /* Never executes */
}
8970:New Thread One starting up...
8970:fork()ing complete
8973:fork()ing complete
8970:New Thread Two starting up...
8970:New Thread Two finishing...
8970:New Thread One finishing...
8970:Main thread finished
8973:Main thread finished
- 8970是父进程吗?
- 网站上说子进程只有单线程,是不是说子进程没有去
sleepnprint函数? - 为什么
8970:fork()ing complete8973:fork()ing complete在8970:New Thread Two starting up...之前打印?线程和进程的顺序是随机的吗?
【问题讨论】:
-
您不能在一个线程中修改一个变量(子变量)并在没有适当同步的情况下在另一个线程中查看它。
-
如果线程可用,为什么还要使用 fork()?在多线程之前的时代,这是一个功能失调的功能。