我讀了一本書,給出了下面的例子:並行線程/等待(狀態)
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