当前位置:网站首页>作业8.3 线程同步互斥机制条件变量
作业8.3 线程同步互斥机制条件变量
2022-08-04 18:24:00 【不知名大学生M】
题目:编写一个程序,开启3个 线程,这3个线程的ID分别为ABC,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示,如ABCABC……依次递推;
提示:A只能叫醒B,B只能唤醒C,C只能唤醒A;
实现代码
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//定义三个条件变量
pthread_cond_t cond1;
pthread_cond_t cond2;
pthread_cond_t cond3;
//互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* A(void* arg)
{
for(int i=0;i<10;i++)
{
pthread_mutex_lock(&mutex);
printf("A");
pthread_cond_signal(&cond2);
pthread_cond_wait(&cond1, &mutex);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* B(void* arg)
{
for(int i=0;i<10;i++)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond2, &mutex);
printf("B");
pthread_cond_signal(&cond3);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* C(void* arg)
{
for(int i=0;i<10;i++)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond3, &mutex);
printf("C");
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建三个条件变量
if(pthread_cond_init(&cond1, NULL) != 0)
{
perror("pthread_cond_init");
return -1;
}
if(pthread_cond_init(&cond2, NULL) != 0)
{
perror("pthread_cond_init");
return -1;
}
if(pthread_cond_init(&cond3, NULL) != 0)
{
perror("pthread_cond_init");
return -1;
}
printf("创建条件变量成功\n");
//创建3个线程
pthread_t tid1,tid2,tid3;
//A线程打印A
if(pthread_create(&tid1,NULL,A,NULL)!=0)
{
perror("pthread_creat");
return -1;
}
//B线程打印B
if(pthread_create(&tid2,NULL,B,NULL)!=0)
{
perror("pthread_creat");
return -1;
}
//C线程打印C
if(pthread_create(&tid3,NULL,C,NULL)!=0)
{
perror("pthread_creat");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
printf("\n");
//销毁互斥锁
pthread_mutex_destroy(&mutex);
//销毁条件变量
pthread_cond_destroy(&cond1);
pthread_cond_destroy(&cond2);
pthread_cond_destroy(&cond3);
return 0;
}
运行结果
边栏推荐
猜你喜欢
从-99打造Sentinel高可用集群限流中间件
limux入门3—磁盘与分区管理
unity中实现ue眼球的渲染
EasyCVR本地接入国标设备映射公网后,本地设备出现无法播放与级联的解决方法
数据库SqlServer迁移PostgreSql实践
Hezhou Cat1 4G module Air724UG is configured with RNDIS network card or PPP dial-up, and the development board is connected to the Internet through the RNDIS network card (taking the RV1126/1109 devel
MMDetection 使用示例:从入门到出门
使用scikit-learn计算文本TF-IDF值
面试官:MVCC是如何实现的?
当项目中自动格式化插件Prettier和ESLint冲突报错时如何解决
随机推荐
关于使用腾讯云HiFlow场景连接器每天提醒签到打卡
JS兼容问题总结
mq消息积压怎么对应
Babbitt | Metaverse daily must-read: Weibo animation will recruit all kinds of virtual idols around the world and provide support for them...
Thrift IDL Sample File
防火墙基础之防火墙做出口设备安全防护
How does the intelligent video surveillance platform EasyCVR use the interface to export iframe addresses in batches?
【软件工程之美 - 专栏笔记】37 | 遇到线上故障,你和高手的差距在哪里?
数据集成:holo数据同步至redis。redis必须是集群模式?
Kubernetes入门到精通- Operator 模式入门
从-99打造Sentinel高可用集群限流中间件
How to make JS code unbreakable
Alibaba Cloud International Edition uses ROS to build WordPress tutorial
网站设计师:Nicepage 4.15 Crack By Xacker
阿里云国际版使用ROS搭建WordPress教程
部署LVS-DR群集
leetcode 14. 最长公共前缀
全球电子产品需求放缓:三星越南工厂大幅压缩产能
gbase8s创建RANGE分片表
OpenInfra Days China 2022 | SelectDB to share with you the Apache Doris in Internet advertising business practices