多线程-互斥锁

发布时间:2024年01月08日

?

从写互斥锁

#include <myhead.h>

char buf[128];   //临界资源

//1.创建互斥锁
pthread_mutex_t mutex;

//定义分支线程
void *task(void *arg)
{
	while(1)
	{
		//2.获取锁资源
		pthread_mutex_lock(&mutex);

		printf("分支线程中:buf = %s\n",buf);
		strcpy(buf,"l love china\n");

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

}

int main(int argc, const char *argv[])
{
	//定义线程号变量
	
	pthread_t tid;
	//2.初始化互斥锁
	pthread_mutex_init(&mutex,NULL);

	//创建线程
	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		printf("tid create error\n");
		return -1;
	}

	while(1)
	{
		printf("主线程buf=%s\n",buf);    //访问临界资源

		strcpy(buf,"hello world\n");
	}
		pthread_join(tid,NULL);         //阻赛回收线程资源
	return 0;
}

从写同步?

#include <myhead.h>

//1.创建一个无名信号量
	sem_t sem; 

//生产者线程
void *task1(void *arg)
{
	while(1)
	{
		sleep(2);
		printf("我生产了一辆特斯拉\n");
	}
	//释放资源
	sem_post(&sem);

}
//消费者资源
void *task2(void *arg)
{
	while(1)
	{
		sem_wait(&sem);  //申请资源,如果没有资源则阻塞
		printf("我消费了一辆特斯拉\n");
	}

}
int main(int argc, const char *argv[])
{
	//创建两个线程
	pthread_t tid1,tid2;
	
	//2.初始化无名信号量
	sem_init(&sem,0,0);

	//创建生产者线程
	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;
	}

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

	//销毁无名信号量
	sem_destory(&sem);
	return 0;
}

?

#include <myhead.h>

sem_t sem1,sem2,sem3;//三个线程分别的无名信号量

void *task1(void *arg)
{
	while(1)
	{
		sem_wait(&sem1);//当前任务的无名信号量
		putchar('A');
		fflush(stdout);//刷新缓冲区
		sleep(1);
		sem_post(&sem2);//无名信号量
	}
}
void *task2(void *arg)
{
	while(1)
	{
		sem_wait(&sem2);
		putchar('B');
		fflush(stdout);
		sleep(1);
		sem_post(&sem3);
	}
}
void *task3(void *arg)
{
	while(1)
	{
		sem_wait(&sem3);
		putchar('C');
		fflush(stdout);
		sleep(1);
		sem_post(&sem1);
	}
}
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("error1\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("error2\n");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task3,NULL)!=0)
	{
		printf("error3\n");
		return -1;
	}
	
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	return 0;
}

?

拷贝

#include <myhead.h>

//创建结构体
tepedef struct node
{
	int start;
	int leng;
	const char *src;
	const char *dest;
}sake;

int file_len(const char *src,const char *dest)
{
	//定义两个文件描述符
	int srcfd,destfd;

	//以只读形式打开源文件
	if((srcfd=open(src,O_RDONLY))==-1)
	{
		perror("srcfd error\n");
		return -1;
	}
	//以只写形式打开目标文件
	if((destfd=open(dest,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("destfd error\n");
		return -1;
	}
	int len =lseek(srcfd,0,SEEK_END);
	
	close(srcfd);
	close(destfd);
	return len;

}
void copy(const char *file1,const char *file2,int start,int len)
{
	//定义两个文件描述符
	int srcfd,destfd;
	int ret=0,count=0;
	//以只读形式打开源文件
	if(( srcfd = open(srcfd,O_RDONLY))==-1)
	{
		perror("srcfd error\n");
		return -1;
	}
	//以只写形式打开目标文件
	if((destfd=open(destfd,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("destfd error\n");
		return -1;
	}
	lseek(srcfd,start,SEEK_SET);
	lseek(destfd,start,SEEK_SET);
	char buf[10];
	while(1)
	{
		ret = read(src,buf,sizeof(buf));

		count+=ret;
		if(ret==0 || count>len)
		{
			write(destfd,buf,ret-(count-len));
			break;
		}
		write(destfd,buf,ret);
	}
	close(srcfd);
	close(destfd);
}
void *task1(void *arg)
{
	//从0开始拷贝到len/2
	copy(((sake*)arg->src,((sake*)arg)->dest,0,((sake*)arg)->len/2);
}
void *task2(void *arg)
{
	copy(((sake*)arg->src,((sake*)arg)->dest,(((sake*)arg)->len/2,((sake*)arg)->len-((sake*)arg)->len/2));
}
int main(int argc, const char *argv[])
{
	//判断外部参数
	if(argc !=3)
	{
		printf("enter error\n");
		printf("格式./a.out 源文件 目标文件\n");
		return -1;
	}
	int len = file_len(argv[1],argv[2]);

	//创建两个线程
	pthread_t tid1,tid2;
	
	if(pthread_creqte(&tid1,NULL,task1,)!=0)
	{
		printf("tid1 error\n");
		return -1;
	}
	if(pthread_creqte(&tid2,NULL,task2,)!=0)
	{
		printf("tid2 error\n");
		return -1;
	}
	//主线程回收资源
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	file = NULL;
	return 0;
}

?

文章来源:https://blog.csdn.net/wanyu_l/article/details/135445939
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。