预测并发代码的输出
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 的生成方式类似。
这是一道与课程作业相关的题,我之前做错了,想不通为什么。
给出如下代码:
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 的生成方式类似。