我创建了以下程序:
void *thread(void *vargp) {
int *ptr = (int*)vargp;
printf("vargp = %p, *vargp = %d\n",vargp, *(int*)vargp);
pthread_exit((void*)*ptr);
}
void *thread2(void *vargp) {
int *ptr = (int*)vargp;
*ptr = 0;
pthread_exit((void*)31);
}
int main(){
int i = 42;
pthread_t tid, tid2;
pthread_create(&tid, NULL, thread, (void*)&i);
printf("i = %d, &i = %p\n", i, &i);
pthread_create(&tid2, NULL, thread2, (void*)&i);
pthread_join(tid, (void**)&i);
pthread_join(tid2, NULL);
printf("at the end i = %d\n",i);
}
我希望主函数中的最后一个printf打印“在结束时i = 42”。但是,它会打印以下内容:
i = 42, &i = 0x7ffcf3b65c4c
vargp = 0x7ffcf3b65c4c, *vargp = 0
0
由于vargp获得与变量i相同的地址,为什么* vargp没有打印出值42,而是值0?
答案 0 :(得分:1)
由于vargp获得与变量i相同的地址,为什么* vargp没有打印出值42,而是值0?
您的程序展示了数据竞争(一种未定义的行为形式):其结果取决于thread
或thread2
是否先运行,并且该订单无法保证。在多处理器机器上(现在最常见),两个线程都可以在同一时间运行。
如果您想保证thread
将在thread2
之前运行,您需要等待(通过pthread_join
)之前创建thread2
。