先看一段简单的代码,如下:
/*************************************************** author : lijd date : 2022-08-18 ***************************************************/ #include <stdio.h> #include <stdio.h> #include <pthread.h> int a, b, x, y; void *Thread1() { a = 1; x = b; return NULL; } void *Thread2() { b = 1; y = a; return NULL; } int main() { int res, i = 1; pthread_t mythread1, mythread2; while(i++) { a = 0; b = 0; x = 0; y = 0; res = pthread_create(&mythread1, NULL, Thread1, NULL); if (res != 0) { printf("线程创建失败"); return 0; } res = pthread_create(&mythread2, NULL, Thread2, NULL); if (res != 0) { printf("线程创建失败"); return 0; } res = pthread_join(mythread1, NULL); res = pthread_join(mythread2, NULL); if(x == 0 && y == 0) { printf("count : %u\n", i); break; } } return 0; }
执行三次结构如下:
分析结果:
理论上两个线程执行的顺序结果如下图:
理论上不会出现 x=0 && y = 0 这种情况,出现这种情况的唯一解释是:指令重排。即如下执行顺序:
07-06
08-14
3779
04-03
571
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交