IO学习

1.一个生产者对应多个消费者

cpp 复制代码
#include<myhead.h>

//创建条件变量
pthread_cond_t cond;

//创建一个互斥锁
pthread_mutex_t mutex;


//生产者
void *tast1(void *arg)
{
	int count=0;
	while(1)
	{
		if(count==3)
			break;
		sleep(1);
		printf("生产了一辆汽车\n");
		pthread_cond_signal(&cond);
		count++;
	}
	pthread_exit(NULL);
}

//消费者
void *tast2(void *arg)
{
	pthread_mutex_lock(&mutex);
	pthread_cond_wait(&cond,&mutex);
	printf("消费者购买了一辆车\n");
	pthread_mutex_unlock(&mutex);
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	//初始化条件变量
	if(pthread_cond_init(&cond,NULL)!=0)
	{
		printf("pthread_cond_init error\n");
		return -1;
	}

	//初始化互斥锁
	if(pthread_mutex_init(&mutex,NULL)!=0)
	{
		printf("pthread_mutex_init\n");
		return -1;
	}

	//创建多个线程
	pthread_t tid[4];

	//生产者线程
	if(pthread_create(&tid[0],NULL,tast1,NULL)!=0)
	{
		printf("pthread_create error\n");
	}
	//消费者进程
	for(int i=1;i<4;i++)
	{
		if(pthread_create(&tid[i],NULL,tast2,NULL)!=0)
		{
			printf("pthread_create error\n");
			return -1;
		}
	}

	for(int i=0;i<4;i++)
		pthread_join(tid[i],NULL);
	return 0;
}

2使用多线程完成abc的顺序打印

cpp 复制代码
#include<myhead.h>


//定义一个无名信号
sem_t sem[3];

void *tast1(void *argc)
{
	sem_post(&sem[0]);
	int count=0;
	while(1)
	{
		if(count==5)
			break;
		sem_wait(&sem[0]);
		printf("a");
		sleep(1);
		fflush(stdout);
		sem_post(&sem[1]);
		count++;
	}
	pthread_exit(NULL);
}

void *tast2(void *argc)
{
	int count=0;
	while(1)
	{
		if(count==5)
			break;
		sem_wait(&sem[1]);
		printf("b");
		sleep(1);
		fflush(stdout);
		sem_post(&sem[2]);
		count++;
	}
	pthread_exit(NULL);
}

void *tast3(void *argc)
{
	int count=0;
	while(1)
	{
		if(count==5)
			break;
		sem_wait(&sem[2]);
		printf("c ");
		sleep(1);
		fflush(stdout);
		sem_post(&sem[0]);
		count++;
	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	//初始化信号量
	for(int i=0;i<3;i++)
		sem_init(&sem[i],0,0);

	pthread_t pid1,pid2,pid3;
	if(pthread_create(&pid1,NULL,tast1,NULL)!=0)
	{
		printf("pthread_create error");
		return -1;
	}
	if(pthread_create(&pid2,NULL,tast2,NULL)!=0)
	{
		printf("pthread_create error");
		return -1;
	}
	if(pthread_create(&pid3,NULL,tast3,NULL)!=0)
	{
		printf("pthread_create error");
		return -1;
	}
	//回收线程资源
	pthread_join(pid1,NULL);
	pthread_join(pid2,NULL);
	pthread_join(pid3,NULL);

	//销毁无名信号量
	for(int i=0;i<3;i++)
	{
		if(sem_destroy(&sem[i])==-1)
		{
			perror("destroy error");
			return -1;
		}
	}

	return 0;
}
相关推荐
代码山河6 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
释厄6237 小时前
AI学习层更新与跨体转移律——人类社会同构·不缺理解缺 U
人工智能·学习
小嘉丶学长11 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
小李不想当小白11 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
adinnet202615 小时前
电商客服对话知识库的自学习闭环与质量演进机制
学习
lazy H16 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
试剂界的爱马仕17 小时前
α-Cyano-4-hydroxycinnamic acid(CHCA)用作 MALDI-TOF 基质的配制与使用
大数据·人工智能·深度学习·学习
小向是个Der17 小时前
嵌入式进阶——编译与链接
汇编·单片机·学习·编译原理·交叉编译
学网安的肆伍17 小时前
认证机制攻防学习|PortSwigger Authentication 靶场复现总结(二):用户名枚举进阶
学习·web安全·网络安全·burpsuite·portswigger·认证安全·靶场复现
海绵宝宝转agent18 小时前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先