1.7 day5 IO进程线程

本文通过实例展示了C++中互斥锁(如pthread_mutex)和信号量(如sem_t)在多线程环境下的使用,包括线程安全的临界区操作以及生产者消费者模型的应用。
摘要由CSDN通过智能技术生成

互斥锁

#include <myhead.h>
char buf[128];//创建临界资源
pthread_mutex_t mutex;//创建锁
void *task(void *arg)//分支线程
{
	while(1)
	{
		pthread_mutex_lock(&mutex);//上锁
		printf("分支线程:buf=%s\n",buf);
		strcpy(buf,"I Love China");
		pthread_mutex_unlock(&mutex);//解锁
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//创建分支线程
	pthread_t tid;
	pthread_mutex_init(&mutex,NULL);//初始化锁
	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		printf("tid create error");
		return -1;
	}

	while(1)
	{
		pthread_mutex_lock(&mutex);
		printf("主线程:buf=%s\n",buf);
		strcpy(buf,"hello world");
		pthread_mutex_unlock(&mutex);
	}
	pthread_join(tid,NULL);//回收分支线程
	pthread_mutex_destroy(&mutex);//销毁锁

	return 0;
}

无名信号量

#include <myhead.h>
char buf[128];//创建临界资源
sem_t sem;//创建无名信号量
void *task(void *arg)//分支线程
{
	while(1)
	{
		sleep(1);
		sem_post(&sem);//释放资源
		printf("我生产了一辆特斯拉\n");
	}
	pthread_exit(NULL);
}
void *task2(void *arg)//分支线程
{
	while(1)
	{
		sem_wait(&sem);//申请资源
		printf("我消费了一辆特斯拉\n");
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//创建分支线程
	pthread_t tid,tid2;
	sem_init(&sem,0,0);//初始化无名信号量
	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		printf("tid create error");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("tid2 create error");
		return -1;
	}
	pthread_join(tid2,NULL);
	pthread_join(tid,NULL);//回收分支线程
	sem_destroy(&sem);//销毁无名信号量
	return 0;
}

三个线程拷贝

#include <myhead.h>
void *task1(void *arg)
{
	int len=*((int *)arg);
	int fd,cfd;
	if((fd=open("./test.bmp",O_RDONLY))==-1)
	{
		perror("open error");
	}
	if((cfd=open("./aa.bmp",O_WRONLY))==-1)
	{
		perror("open error");
	}
	char buf[128]="";
	int res;
	int sum=0;
	lseek(fd,0,SEEK_SET);
	lseek(cfd,0,SEEK_SET);
	while((res=read(fd,buf,sizeof(buf)))!=0)
	{
		sum+=res;
		if(sum>=len)
		{
			write(cfd,buf,res-(sum-len));
			break;
		}
		write(cfd,buf,res);
	}
	close(fd);
	close(cfd);
	pthread_exit(NULL);
}
void *task2(void *arg)
{
	int len=*((int *)arg);
	int fd,cfd;
	if((fd=open("./test.bmp",O_RDONLY))==-1)
	{
		perror("open error");
	}
	if((cfd=open("./aa.bmp",O_WRONLY))==-1)
	{
		perror("open error");
	}
	char buf[128]="";
	int res;
	lseek(fd,len,SEEK_SET);
	lseek(cfd,len,SEEK_SET);
	while((res=read(fd,buf,sizeof(buf)))!=0)
	{
		write(cfd,buf,res);
	}
	close(fd);
	close(cfd);
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	int fd,cfd;
	if((fd=open("./test.bmp",O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	if((cfd=open("./aa.bmp",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open error");
		return -1;
	}
	int len=lseek(fd,0,SEEK_END)/2;
	pthread_t tid1,tid2;
	if(pthread_create(&tid1,NULL,task1,&len)!=0)
	{
		printf("tid1 create error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,&len)!=0)
	{
		printf("tid2 create error\n");
		return -1;
	}

	close(fd);
	close(cfd);
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	return 0;
}

三个线程输出ABC

#include <myhead.h>
char buf[128];//创建临界资源
sem_t sem1;//创建无名信号量
sem_t sem2;//创建无名信号量
sem_t sem3;//创建无名信号量
void *task(void *arg)//分支线程
{
	while(1)
	{
		sem_wait(&sem1);//申请资源
		printf("A");
		sem_post(&sem2);//释放资源
	}
	pthread_exit(NULL);
}
void *task2(void *arg)//分支线程
{
	while(1)
	{
		sem_wait(&sem2);//申请资源
		printf("B");
		sem_post(&sem3);//释放资源
	}
	pthread_exit(NULL);
}
void *task3(void *arg)//分支线程
{
	while(1)
	{
		sem_wait(&sem3);//申请资源
		printf("C\n");
		sem_post(&sem1);//释放资源
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//创建分支线程
	pthread_t tid,tid2,tid3;
	sem_init(&sem1,0,1);//初始化无名信号量sem1
	sem_init(&sem2,0,0);//初始化无名信号量sem2
	sem_init(&sem3,0,0);//初始化无名信号量sem3
	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		printf("tid create error");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("tid2 create error");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task3,NULL)!=0)
	{
		printf("tid3 create error");
		return -1;
	}
	pthread_join(tid,NULL);//回收分支线程
	pthread_join(tid2,NULL);//回收分支线程
	pthread_join(tid3,NULL);//回收分支线程
	sem_destroy(&sem1);//销毁无名信号量sem1
	sem_destroy(&sem2);//销毁无名信号量sem2
	sem_destroy(&sem3);//销毁无名信号量sem3
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值