DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步

news/2025/1/24 11:20:52/

题目

        请使用互斥锁 和 信号量分别实现5个线程之间的同步

代码:信号量实现

void* task1(void* arg);
void* task2(void* arg);
void* task3(void* arg);
void* task4(void* arg);
void* task5(void* arg);sem_t sem[5];					//信号量变量int main(int argc, const char *argv[])
{//信号量初始化for(int i=0;i<5;i++){sem_init(&sem[i],0,0);//初始化信号量数量}sem_post(&sem[0]);//线程初始化pthread_t id[4];pthread_create(&id[0],0,task1,NULL);pthread_create(&id[1],0,task2,NULL);pthread_create(&id[2],0,task3,NULL);pthread_create(&id[3],0,task4,NULL);pthread_detach(id[0]);pthread_detach(id[1]);pthread_detach(id[2]);pthread_detach(id[3]);while(1){task5(NULL);}return 0;
}void* task1(void* arg)
{while(1){sem_wait(&sem[0]);		//获取信号量0printf("报数:1\n");sleep(1);sem_post(&sem[1]);		//释放信号量1}
}void* task2(void* arg)
{while(1){sem_wait(&sem[1]);	//获取信号量0printf("报数:2\n");sleep(1);sem_post(&sem[2]);		//释放信号量1}
}void* task3(void* arg)
{while(1){sem_wait(&sem[2]);	//获取信号量0printf("报数:3\n");sleep(1);sem_post(&sem[3]);		//释放信号量1}
}void* task4(void* arg)
{while(1){sem_wait(&sem[3]);	//获取信号量0printf("报数:4\n");sleep(1);sem_post(&sem[4]);		//释放信号量1}
}void* task5(void* arg)
{while(1){sem_wait(&sem[4]);	//获取信号量0printf("报数:5\n\n");sleep(1);sem_post(&sem[0]);		//释放信号量1}
}

效果

代码:互斥锁实现

void* task1(void* arg);
void* task2(void* arg);
void* task3(void* arg);
void* task4(void* arg);
void* task5(void* arg);pthread_mutex_t mutex[5];		//互斥锁变量int main(int argc, const char *argv[])
{//互斥锁初始化pthread_mutexattr_t mutex_attr; //锁属性pthread_mutexattr_init(&mutex_attr); //锁属性初始化for(int i=0;i<5;i++){pthread_mutex_init(&mutex[i],&mutex_attr);		//默认锁pthread_mutex_lock(&mutex[i]);                  //上锁}pthread_mutex_unlock(&mutex[0]);                    //解锁0//线程初始化pthread_t id[4];pthread_create(&id[0],0,task1,NULL);pthread_create(&id[1],0,task2,NULL);pthread_create(&id[2],0,task3,NULL);pthread_create(&id[3],0,task4,NULL);pthread_detach(id[0]);pthread_detach(id[1]);pthread_detach(id[2]);pthread_detach(id[3]);while(1){task5(NULL);}return 0;
}void* task1(void* arg)
{while(1){pthread_mutex_lock(&mutex[0]);      //上锁0printf("报数:1\n");sleep(1);pthread_mutex_unlock(&mutex[1]);    //开锁1}
}void* task2(void* arg)
{while(1){pthread_mutex_lock(&mutex[1]);      //上锁0printf("报数:2\n");sleep(1);pthread_mutex_unlock(&mutex[2]);    //开锁1}
}void* task3(void* arg)
{while(1){pthread_mutex_lock(&mutex[2]);      //上锁2printf("报数:3\n");sleep(1);pthread_mutex_unlock(&mutex[3]);    //开锁3}
}void* task4(void* arg)
{while(1){pthread_mutex_lock(&mutex[3]);      //上锁3printf("报数:4\n");sleep(1);pthread_mutex_unlock(&mutex[4]);    //开锁4}
}void* task5(void* arg)
{while(1){pthread_mutex_lock(&mutex[4]);      //上锁4printf("报数:5\n\n");sleep(1);pthread_mutex_unlock(&mutex[0]);    //开锁0}
}

效果


http://www.ppmy.cn/news/1565769.html

相关文章

设计模式的艺术-享元模式

结构性模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解享元模式 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。 在享元模式中&#xff0c;存储这些共享实例对象的地方称为享元池&…

计算机图形学:实验一 OpenGL基本绘制

1.OpenGL的环境配置&#xff1a; 集成开发环境Visual Studio Community 2019的安装&#xff1a; 在Windows一栏选择使用C的桌面开发&#xff1b;再转到“单个组件”界面&#xff0c;在“编译器、生成工具和运行时”一栏选择用于“Windows的C CMake工具”&#xff1b;然后转到…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…

Lock和Synchronized的区别,源码分析

Lock和Synchronized的区别&#xff0c;源码分析 探究Lock锁&#xff08;指实现Lock接口的锁&#xff0c;比如是ReentrantLock锁&#xff09;与Synchronized的区别。 以上区别都体现在Lock接口里定义的方法&#xff0c;以及实现Lock接口的类&#xff08;比如ReentrantLock&#…

Azure学生订阅上手实操:在Ubuntu VPS上利用Docker快速部署PostgreSQL数据库

引言 本文将详细指导您如何在Azure 100学生订阅中&#xff0c;利用Ubuntu虚拟机&#xff0c;通过Docker容器技术快速搭建PostgreSQL数据库。我们将从Docker和PostgreSQL的基础知识入手&#xff0c;逐步讲解部署过程中的每一个步骤&#xff0c;并提供完整的命令和配置文件示例。…

冯诺依曼架构和哈佛架构的主要区别?

冯诺依曼架构&#xff08;Von Neumann Architecture&#xff09;和哈佛架构&#xff08;Harvard Architecture&#xff09;是两种计算机体系结构&#xff0c;它们在存储器组织、指令处理和数据存取等方面有明显的不同。以下是它们的主要区别&#xff1a; 1.存储器结构 冯诺依曼…

AI如何帮助解决生活中的琐碎难题?

引言&#xff1a;AI已经融入我们的日常生活 你有没有遇到过这样的情况——早上匆忙出门却忘了带钥匙&#xff0c;到了公司才想起昨天的会议资料没有打印&#xff0c;或者下班回家还在纠结晚饭吃什么&#xff1f;这些看似微不足道的小事&#xff0c;往往让人疲惫不堪。而如今&a…

【R语言】数学运算

一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…