我知道两个线程都可以使用全局变量k
和p
,并且在一个线程的CPU时间到期后,另一个线程获得CPU时间,这就是为什么我得到不同的输出,如9、6、10、15,但我不明白输出10和15是如何产生的。我猜这是因为变量y
,尽管我没有使用它。
int k=2;
int* p;
void t1_f1(void){
int x=3;
p=&x;
sleep(1);
}
void t1_f2(void){
int y=5;
k++;
sleep(1);
}
void* t1_main(void* args){
t1_f1();
t1_f2();
return NULL;
}
void* t2_main(void* args){
sleep(1);
k=k* *p;
printf("%d \n", k);
return NULL;
}
int main(int argc, char ** argv){
pthread_t threads[2];
pthread_create(threads+1, NULL, t2_main, NULL);
pthread_create(threads, NULL, t1_main, NULL);
pthread_join(threads[0],NULL);
pthread_join(threads[1],NULL);
exit(0);
}
1条答案
按热度按时间vpfxa7rd1#
您的程序具有UB(
Undefined Behavior
),因此您根本无法期望任何一致的输出。代码中UB的2个示例:
1.在
t1_f1
中,你将全局变量p
赋值给一个局部变量(x
)的地址,当函数返回时x
超出作用域,你将得到一个逗弄的指针,在t2_main
中取消对它的引用(*p
)是UB。t2_main
可能在p
初始化之前就执行了(它不是在定义它的全局作用域初始化的)。在这种情况下,解引用它也是UB。请注意,正如@AndrewHenle在上面所评论的,
sleep()
不是线程同步调用。