预测并发代码的输出

Predict output of concurrent code

这是一道与课程作业相关的题,我之前做错了,想不通为什么。

给出如下代码:

int i = 0;

void *doit(void *vargp) {
    i = i + 5;
}

int main() { 
    pthread_t tid; 
    ptr = &i;
    pthread_create(&tid, NULL, doit, NULL);
    i = i + 3; 
    pthread_join(tid, NULL); 
    printf("%d",i);
}

可能的输出是 8、3 和 5。

我对代码的理解是主线程调用了pthread_join(),在继续之前等待doit线程,所以两个操作(i += 5和i += 3)都必须执行在打印语句到达之前。所以,我不明白 3 和 5 是如何可能的输出。

我对 pthread_join() 的理解有误吗?或者这可能是教授的错误?我完全可以看出 8 是一个可能的输出值,但我不太确定 3 和 5。

如果 i = i + 3 首先开始 运行,则

3 是可能的。 i + 3 将评估为 3。这可能会写回 i 所有 i = i + 5 语句已经 运行 之后。

8 和 5 的生成方式类似。