#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号
广州松河信息科技有限公司 版权所有