C语言 线程和全局变量:为什么我得到10或15作为输出,虽然我没有使用变量y?

vbopmzt1  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(116)

我知道两个线程都可以使用全局变量kp,并且在一个线程的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);
}
vpfxa7rd

vpfxa7rd1#

您的程序具有UBUndefined Behavior),因此您根本无法期望任何一致的输出。

代码中UB的2个示例:

1.在t1_f1中,你将全局变量p赋值给一个局部变量(x)的地址,当函数返回时x超出作用域,你将得到一个逗弄的指针,在t2_main中取消对它的引用(*p)是UB。

  1. t2_main可能在p初始化之前就执行了(它不是在定义它的全局作用域初始化的)。在这种情况下,解引用它也是UB。
    请注意,正如@AndrewHenle在上面所评论的,sleep()不是线程同步调用。

相关问题