我读了一本书,给出了下面的例子:并行线程/等待(状态)
int value=0
int thread_func(int id) {
int temp;
temp=value+id;
printf("Thread%d value: %d", id, temp);
value=temp;
}
int main() {
int fork_id, status, i;
pthread_t tids[3];
fork_id=fork();
if (fork_id == 0) {
for (i=1; i≤3; i++)
pthread_create(&tids[i-1], NULL, thread_func, i);
for (i=0; i≤2; i++)
pthread_join(tids+i, &status);
printf("Second process value: %d", value);
}
else {
wait(&status);
printf("First process value: %d", value)
}
我不明白两两件事: 当我读到,该行已在printf("First process value: %d", value)
是唯一的价值0. 但是为什么?等待(&状态)将一直等到子进程终止。在这种情况下,只有在所有连接都完成后才会终止。意思是,当值为6.
其次,在行printf("Second process value: %d", value);
,值可以从1到6.这也很奇怪,因为我们有连接指令。
谢谢你的回答。关于我的第二个问题:我们真的不知道三个子线程的变量值是以哪种顺序变化的,但是我们可以知道,在所有三个线程完成后(因为连接指令),我们将到达这一行。我错过了什么? –
@Adam Sh:问题是,例如在一次执行中,第一个线程使'temp = 0 + 1',然后设置'value = 1'。然后第二个线程到达,使'temp = 1 + 2'然后设置'value = 3',最后一个线程使'temp = 3 + 3'并设置'value = 6'。在另一个可能的执行过程中,第一个线程设置'temp = 0 + 1',但是在达到'temp = value'之前,第二个线程'temp = 0 + 2'(因为线程1没有达到'temp = value')然后使'值= 2'。现在你可以看到最终的价值会完全不同。 – Tudor