IO进程线程:通信

1.定义互斥锁

#include<myhead.h>

int num=520;//临界资源

//1.创建一个互斥锁变量
pthread_mutex_t mutex;

//定义任务1函数
void *task1(void *arg)
{
	printf("11111111111111\n");

	//3.获取锁资源
	pthread_mutex_lock(&mutex);

	num=1314;

	sleep(3);

	printf("task1:num=%d\n",num);

	//释放锁资源
	pthread_mutex_unlock(&mutex);
}

//定义任务2函数
void *task2(void *arg)
{
	printf("22222222222222\n");
	//3.获取锁资源
	pthread_mutex_lock(&mutex);

	num++;
	sleep(1);//在休眠时,任务1执行到赋值语句
	printf("task2:num=%d\n",num);

	//释放锁资源
	pthread_mutex_unlock(&mutex);
}
int main(int argc, const char *argv[])
{
	//2.初始化互斥锁
	pthread_mutex_init(&mutex,NULL);
	
	//创建两个线程
	pthread_t tid1,tid2;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		printf("tid1 create error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("tid2 create error\n");
		return -1;
	}
	printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);

	//回收线程资源
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	//5.销毁锁资源
	pthread_mutex_destroy(&mutex);
	return 0;
}

2.定义无名信号量

#include<myhead.h>
//1.创建无名信号量
sem_t sem;

//定义生产者线程
void *task1(void *arg)
{
	int num=5;
	while(num--)
	{
		sleep(1);
		printf("我生产了一辆特斯拉\n");

		//4.释放资源
		sem_post(&sem);
	}
	pthread_exit(NULL);//退出线程
}

//定义消费者线程
void *task2(void *arg)
{
	int num=5;
	while(num--)
	{
		//3.申请资源
		sem_wait(&sem);

		printf("我消费了一辆特斯拉\n");
	}
	pthread_exit(NULL);//退出线程
}
int main(int argc, const char *argv[])
{
	//2.初始化无名信号量
	sem_init(&sem,0,0);//第一个0表示用于线程同步,第二个0表示初始资源为0

	//创建两个线程,分别是生产者和消费者
	pthread_t tid1,tid2;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		printf("tid1 create error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("tid2 create error\n");
		return -1;
	}
	printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);

	//回收线程资源
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	//释放无名信号量
	sem_destroy(&sem);
	return 0;
}

3.创建三个线程,线程1打印输出字符A,线程2打印输出字符B,线程3打印输出字符C,用无名信号量输出结果为ABCABCABCABCABC。

#include<myhead.h>
//创建无名信号量
sem_t sem1,sem2,sem3;

//定义线程1
void *task1(void *arg)
{
	int num=5;
	while(num--)
	{
		sem_wait(&sem1);
		sleep(1);
		printf("A");
		fflush(stdout);
		sem_post(&sem2);
	}
	pthread_exit(NULL);
}
//定义线程2
void *task2(void *arg)
{
	int num=5;
	while(num--)
	{
		sem_wait(&sem2);
		sleep(1);
		printf("B");
		fflush(stdout);
		sem_post(&sem3);
	}
	pthread_exit(NULL);
}
//定义线程3
void *task3(void *arg)
{
	int num=5;
	while(num--)
	{
		sem_wait(&sem3);
		sleep(1);
		printf("C");
		fflush(stdout);
		sem_post(&sem1);
	}
	pthread_exit(NULL);
}


int main(int argc, const char *argv[])
{
	sem_init(&sem1,0,1);
	sem_init(&sem2,0,0);
	sem_init(&sem3,0,0);

	pthread_t tid1,tid2,tid3;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		printf("tid1 create error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("tid2 create error\n");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task3,NULL)!=0)
	{
		printf("tid3 create error\n");
		return -1;
	}

	printf("tid1:%#lx,tid2:%#lx,tid3:%#lx\n",tid1,tid2,tid3);

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);

	sem_destroy(&sem1);
	sem_destroy(&sem2);
	sem_destroy(&sem3);

	puts("");
	return 0;
}

4.线程同步之条件变量

#include<myhead.h>
//1.定义条件变量
pthread_cond_t cond;

//11.定义互斥锁变量
pthread_mutex_t mutex;

//定义生产者线程1
void *task1(void *arg)
{
	int num=5;
	while(num--)
	{
		sleep(1);
		printf("%#lx:生产了一辆特斯拉\n",pthread_self());

		//3.唤醒一个消费者
		//pthread_cond_signal(&cond);
	}
	//3.唤醒所有的等待线程
	pthread_cond_broadcast(&cond);

	//退出线程
	pthread_exit(NULL);
}
//定义消费者线程2
void *task2(void *arg)
{
	//33.上锁
	pthread_mutex_lock(&mutex);

	//4.进入等待队列
	pthread_cond_wait(&cond,&mutex);

	printf("%#lx:消费了一辆特斯拉\n",pthread_self());

	//44.解锁
	pthread_mutex_unlock(&mutex);

	//退出线程
	pthread_exit(NULL);
}
//定义消费者线程3
void *task3(void *arg)
{
	//33.上锁
	pthread_mutex_lock(&mutex);

	//4.进入等待队列
	pthread_cond_wait(&cond,&mutex);

	printf("%#lx:消费了一辆特斯拉\n",pthread_self());

	//44.解锁
	pthread_mutex_unlock(&mutex);

	//退出线程
	pthread_exit(NULL);
}
//定义消费者线程4
void *task4(void *arg)
{
	//33.上锁
	pthread_mutex_lock(&mutex);

	//4.进入等待队列
	pthread_cond_wait(&cond,&mutex);

	printf("%#lx:消费了一辆特斯拉\n",pthread_self());

	//44.解锁
	pthread_mutex_unlock(&mutex);

	//退出线程
	pthread_exit(NULL);
}
//定义消费者线程5
void *task5(void *arg)
{
	//33.上锁
	pthread_mutex_lock(&mutex);

	//4.进入等待队列
	pthread_cond_wait(&cond,&mutex);

	printf("%#lx:消费了一辆特斯拉\n",pthread_self());

	//44.解锁
	pthread_mutex_unlock(&mutex);

	//退出线程
	pthread_exit(NULL);
}
//定义消费者线程6
void *task6(void *arg)
{
	//33.上锁
	pthread_mutex_lock(&mutex);

	//4.进入等待队列
	pthread_cond_wait(&cond,&mutex);

	printf("%#lx:消费了一辆特斯拉\n",pthread_self());

	//44.解锁
	pthread_mutex_unlock(&mutex);

	//退出线程
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//2.初始化条件变量
	pthread_cond_init(&cond,NULL);

	//22.初始化互斥锁
	pthread_mutex_init(&mutex,NULL);

	//创建六个线程,一个生产者,五个消费者
	pthread_t tid1,tid2,tid3,tid4,tid5,tid6;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		printf("tid1 create error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("tid2 create error\n");
		return -1;
	}	
	if(pthread_create(&tid3,NULL,task3,NULL)!=0)
	{
		printf("tid3 create error\n");
		return -1;
	}
	if(pthread_create(&tid4,NULL,task4,NULL)!=0)
	{
		printf("tid4 create error\n");
		return -1;
	}
	if(pthread_create(&tid5,NULL,task5,NULL)!=0)
	{
		printf("tid5 create error\n");
		return -1;
	}
	if(pthread_create(&tid6,NULL,task6,NULL)!=0)
	{
		printf("tid6 create error\n");
		return -1;
	}
	printf("tid1:%#lx,tid2:%#lx,tid3:%#lx,tid4:%#lx,tid5:%#lx5,tid6:%#lx\n",tid1,tid2,tid3,tid4,tid5,tid6);

	//回收线程资源
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	pthread_join(tid4,NULL);
	pthread_join(tid5,NULL);
	pthread_join(tid6,NULL);

	//5.销毁条件变量
	pthread_cond_destroy(&cond);

	//55.销毁互斥锁
	pthread_mutex_destroy(&mutex);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/409366.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法:红黑树讲解

关于红黑树&#xff0c; 这篇讲的更详细易懂。 https://www.cnblogs.com/jakelin/p/14324966.html 一颗平衡的二叉搜索树的任意节点平均查找效率为树的高度h&#xff0c;即O(lgn)。 但是如果二叉搜索树的失去平衡&#xff08;元素全在一侧&#xff09;&#xff0c;搜索效率就…

牛客周赛 Round 33 解题报告 | 珂学家 | 思维场

前言 整体评价 感觉这场更偏思维&#xff0c;F题毫无思路&#xff0c;但是可以模拟骗点分, E题是dij最短路. A. 小红的单词整理 类型: 签到 w1,w2 input().split() print (w2) print (w1)B. 小红煮汤圆 思路: 模拟 可以从拆包的角度去构建模拟 注意拆一包&#xff0c;可以…

如何增加层次厚度?

Q 老师&#xff0c;我在做一个斧头武器&#xff0c;如何在平面上增加厚度和层次呢&#xff1f; A 选中这几个线&#xff0c;点连接就会出现中线&#xff0c;把中线稍作调整即可~

Springboot+vue的社区医疗综合服务平台(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区医疗综合服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区医疗综合服务平台&#xff0c;采用M&#xff08;m…

数据分析这么卷吗!AI几分钟做完我半天的工作,这让人怎么办!

随着AI技术的飞速发展&#xff0c;人工智能领域正在经历一场前所未有的革命。无论是ChatGPT还是谷歌的巴德&#xff0c;以及国内诸如文心一言、ChatGLM等产品的涌现&#xff0c;都在不断地证明着这一点。这些技术不仅在推动着各行业的发展&#xff0c;更在不断地改变着我们的生…

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…

详细分析Pandas中的Series对象(附Demo)

目录 1. 问题所示2. 基本知识3. API Demo4. 示例Demo5. 彩蛋 1. 问题所示 从实战上手基础知识 一开始遇到这个Bug&#xff1a; TypeError: unsupported operand type(s) for -: str and float后面经了解执行减法运算时发生了错误&#xff0c;其中一个操作数是字符串类型&…

继承(extends)

继承[extends] 继承的好处继承的示意图继承的使用细节JVM的内存&#xff1a;继承的内存布局 继承的好处 1&#xff09;提高代码的复用性 2&#xff09;代码的扩展性和维护性提高了 继承的示意图 继承的使用细节 1&#xff09;子类继承了所有属性和方法&#xff0c;非私有的…

liunx前后端分离项目部署

文章目录 1、nginx的安装和自启动2.nginx负载均衡3.前后端项目部署-后端部署4.前后端项目部署-前端部署 1、nginx的安装和自启动 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel1.安装我们nginx所需要的依赖 wget http://nginx.org/download/nginx-1.…

线程池的常用实现及执行流程

线程池 线程池线程池接口线程池参数线程池分类动态数目线程池固定数目线程池单例线程池任务调度线程池 线程池的执行流程 线程池 线程池接口 线程池参数 1、corePoolSize&#xff1a;核心线程数&#xff0c;线程池中最少线程&#xff0c;核心线程不会被回收。 2、maximumPoo…

做接口测试的流程一般是怎么样的?UI功能6大流程、接口测试8大流程这些你真的全会了吗?

在讲接口流程测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更…

自定义搭建管理系统

最近使用自己搭建的脚手架写了一个简易管理系统&#xff0c;使用webpackreactantd&#xff0c;搭建脚手架参考&#xff1a; 使用Webpack5搭建项目&#xff08;react篇&#xff09;_babel-preset-react-app-CSDN博客 搭建的思路&#xff1a; 1. 基建布局&#xff0c;使用antd的…

Linux调用可执行程序:system()函数和execl函数

system()函数&#xff1a; system()函数是一个在C/C编程语言中的库函数&#xff0c;用于在操作系统中执行命令。 函数声明如下&#xff1a; int system(const char *command);该函数接受一个指向以空字符结尾的字符串的指针作为参数&#xff0c;该字符串包含要执行的命令。函…

[ai笔记12] chatGPT技术体系梳理+本质探寻

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第12篇分享&#xff01; 这周时间看了两本书&#xff0c;一本是大神斯蒂芬沃尔弗拉姆学的《这就是ChatGPT》,另外一本则是腾讯云生态解决方案高级架构师宋立恒所写的《AI制胜机器学习极简入门》&#xf…

OpenHarmony Docker移植实践

Docker简介 从操作系统诞生之日起&#xff0c;虚拟化技术就不断的演进与发展&#xff0c;结合目前云原生的发展态势&#xff0c;容器无疑是其中的重要一环。 Docker是一个开源的软件项目&#xff0c;可以在Linux操作系统上提供一层额外的抽象&#xff0c;让用户程序部署在一个…

单日收益四位数的Ai姓氏头像项目

单日收益四位数的Ai姓氏头像项目 发布时间&#xff1a;2024-02-24 00:00:00作者&#xff1a;傲战浏览&#xff1a;未知分类&#xff1a;教程网朗读&#xff1a; 最近利用AI一键生成头像的这个项目又火起来了,据说一天直播间光礼物就能收到大几千 操作起来没什么难度,一键生成 …

HarmonyOS-ArkTS卡片运行机制和相关模块

ArkTS卡片运行机制 实现原理 图1 ArkTS卡片实现原理 卡片使用方&#xff1a;显示卡片内容的宿主应用&#xff0c;控制卡片在宿主中展示的位置&#xff0c;当前仅系统应用可以作为卡片使用方。卡片提供方&#xff1a;提供卡片显示内容的应用&#xff0c;控制卡片的显示内容、…

LeetCode--代码详解 235.二叉搜索树得最近公共祖先

235.二叉搜索树得最近公共祖先 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可…

nginx------------- 变量 日志分割 自定义图标 证书 (四)

一、高级配置 1 .1网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机…

RunnerGo五种压测模式你会配置吗?

我们在做性能测试时需要根据性能需求配置不同的压测模式如&#xff1a;阶梯模式。使用jmeter时我们需要安装插件来配置测试模式&#xff0c;为了方便用户使用&#xff0c;RunnerGo内嵌了压测模式这一选项&#xff0c;今天给大家介绍一下RunnerGo的几种压测模式和怎么根据性能需…
最新文章