#include<stdio.h> #include<stdlib.h> #include<pthread.h> //全局变量,模拟总的票数 int ticket_sum = 10; //模拟4个售票员一起售卖票的过程 void *sell_ticket(void *arg){ int i; //4个售票员负责将 10 张票全部卖出 for (i = 0; i < 10; i++) { //直至所有票全部卖出,4 个售票员才算完成任务 if (ticket_sum > 0) { sleep(1); //每个线程代表一个售票员 printf("%u 卖第 %d 张票\n", pthread_self(), 10 - ticket_sum + 1); ticket_sum--; } } return 0; } int main(){ int flag; int i; void *ans; //创建 4 个线程,代表 4 个售票员 pthread_t tids[4]; for (i = 0; i < 4; i++) { flag = pthread_create(&tids[i], NULL, &sell_ticket, NULL); if (flag != 0) { printf("线程创建失败!"); return 0; } } sleep(10); // 阻塞主线程,等待所有子线程执行结束 for (i = 0; i < 4; i++) { flag = pthread_join(tids[i], &ans); if (flag != 0) { printf("tid=%d 等待失败!", tids[i]); return 0; } } return 0; }程序中新建了 4 个子线程,每个线程都可以访问 ticket_sum 全局变量,它们共同执行 sell_ticket() 函数,模拟“4个售票员共同售卖 10 张票”的过程。
[root@localhost ~]# gcc thread.c -o thread.exe -lpthread
[root@localhost ~]# ./thread.exe
3296569088 卖第 1 张票
3265099520 卖第 2 张票
3286079232 卖第 3 张票
3275589376 卖第 4 张票
3286079232 卖第 5 张票
3265099520 卖第 6 张票
3296569088 卖第 7 张票
3275589376 卖第 8 张票
3286079232 卖第 9 张票
3265099520 卖第 10 张票
3275589376 卖第 11 张票
3296569088 卖第 12 张票
3286079232 卖第 13 张票
1492682496 卖第 1 张票
1503172352 卖第 1 张票
1482192640 卖第 1 张票
1471702784 卖第 1 张票
1503172352 卖第 5 张票
1482192640 卖第 6 张票
1492682496 卖第 6 张票
1471702784 卖第 6 张票
1503172352 卖第 9 张票
1492682496 卖第 9 张票
1471702784 卖第 9 张票
1482192640 卖第 12 张票
1503172352 卖第 13 张票
ticket_sum--
操作,导致其它线程计算10-ticket_sum+1
表达式时,读取到的 ticket_num 变量的值为负数,因此表达式的值会出现大于 10 的情况。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有