day5io

思维导图

1.线程互斥设置

#include<head.h>
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
//临界资源
char buf[20];
//创建锁
pthread_mutex_t mutex;

void *task(void *arg)
{
	//拒绝取消信号	
	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);

	while(1)
	{
		//上锁
		pthread_mutex_lock(&mutex);
		strcpy(buf,"子线程");
		printf("这里是:%s\n",buf);
		sleep(1);
		//释放锁
		pthread_mutex_unlock(&mutex);
	}

	pthread_exit(NULL);

}
int main(int argc, const char *argv[])
{
	//初始化锁
	pthread_mutex_init(&mutex,NULL);

	//创建线程1
	pthread_t tid=0;

	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		puts("error create");
		return -1;
	
	}
	

	//分离态,自动回收
	pthread_detach(tid);

	//主线程
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mutex);
		strcpy(buf,"主线程");
		printf("这里是:%s\n",buf);
		sleep(1);
		//开锁
		pthread_mutex_unlock(&mutex);
	}


	//摧毁锁
	pthread_mutex_destroy(&mutex);



	return 0;
}

2同步机制代码

#include<head.h>
#include <stdio.h>
#include<string.h>
#include<stdlib.h>

sem_t  sem;

void *task1(void *arg)
{
    
    while(1)
    {
        sem_wait(&sem);

        printf("得到一辆车\n");
        sleep(1);
    }
    pthread_exit(NULL);

}
void *task2(void *arg)
{
    while(1)
    {
        printf("产出一辆车\n");
        sem_post(&sem);
        sleep(1);
    
    }

    pthread_exit(NULL);

}

int main(int argc, const char *argv[])
{

    //无名变量初始化
    sem_init(&sem,0,0);

    //线程1
    pthread_t tid1=0;
    
    if(pthread_create(&tid1,NULL,task1,NULL)!=0)
    {
        puts("error task1");
        return -1;
    }
    
    //线程2
    pthread_t tid2=0;
    if(pthread_create(&tid2,NULL,task2,NULL)!=0)
    {
        puts("");
        return -1;
    }


    //阻塞回收线程
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    
    //销毁sem_t
    sem_destroy(&sem);


    return 0;
}
 

3多线程文件拷贝

#include<head.h>
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
//锁变量
pthread_mutex_t mutex;

typedef struct Info
{
	const char *rd;
	const char *wr;
	int len;

}info;

//文件长度计算
int len_Get(const char *rd,const char *wr)
{
	//只读打开文件
	int fd1=open(rd,O_RDONLY);

	if(fd1==-1)
	{
		perror("fd1 error");
		return -1;
	}

	//创建复印件
	int fd2=open(wr,O_WRONLY | O_CREAT | O_TRUNC,0644);
	if(fd2==-1)
	{
		perror("fd2 error");
		return -1;
	}

	//读取fd1文件长度
	int len=lseek(fd1,0,SEEK_END);
	lseek(fd1,0,SEEK_SET);
	//关闭文件
	
	close(fd1);
	close(fd2);

	//返回len
	return len;
}

//拷贝函数
int my_copy(const char * rd,const char *wr,int star,int len)
{
	//只读打开文件
	int fd1=open(rd, O_RDONLY);
	if(fd1==-1)
	{
		perror("fd1 error");
		return -1;
	}
	
	//只写打开
	int fd2=open(wr,O_WRONLY);
	if(fd2==-1)
	{
		perror("fd2 error");
		return -1;
	}
	
	//选定打印位置
	lseek(fd1,star,SEEK_SET);
	lseek(fd2,star,SEEK_SET);
	//拷贝
	
	char buf[128];
	int res=0;//每次读取字符数
	int sum=0;//总打印字符数
	while(1)
	{
		res=read(fd1,buf,sizeof(buf));
		sum+=res;
	
		if(res==0 || sum>=len);
		{
			write(fd2,buf,res-(sum-len));//打印剩余字符

			break;
		}

		write(fd2,buf,res);
	
	}

	//关闭文件
	close(fd1);
	close(fd2);

	return 0;

}

void *task1(void *st)
{
	pthread_mutex_lock(&mutex);
	//拷贝前半段
	my_copy(((struct Info*)st)->rd,((struct Info*)st)->wr,0,(((struct Info*)st)->len)/2);
	pthread_mutex_unlock(&mutex);
	//退出线程
	pthread_exit(NULL);

}
void *task2(void *st)
{
	pthread_mutex_lock(&mutex);
	//拷贝后半段
	my_copy(((struct Info*)st)->rd,((struct Info*)st)->wr,((struct Info*)st)->len/2,((struct Info*)st)->len-(((struct Info*)st)->len/2));
	pthread_mutex_unlock(&mutex);
	//退出线程
	pthread_exit(EXIT_SUCCESS);

}



int main(int argc, const char *argv[])
{
		
	//判断参数
	if(argc!=3)
	{
		puts("usage:./a.out file1 file2");
		return -1;
	}

	int len=len_Get(argv[1],argv[2]);
	printf("%d\n",len);
	info st={argv[1],argv[2],len};

	//线程号
	pthread_t tid1=0;
	pthread_t tid2=0;

	//锁初始化
	pthread_mutex_init(&mutex,NULL);

	//创建线程
	if(pthread_create(&tid2,NULL,task1,&st)!=0)
	{
		puts("error");
		return -1;
	}

	if(pthread_create(&tid1,NULL,task2,&st)!=0)
	{
		puts("error");
		return -1;
	}

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

	//毁灭锁
	pthread_mutex_destroy(&mutex);




	return 0;
}

4三个线程打印ABC

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<head.h>

//根据时间片,设置队列
int count=1;//控制队列

void *task1(void *a)
{
	while(1)
	{
		if(count==1)
		{
		fputc('A',stdout);
		count=2;
		}
	}

}
void *task2(void *a)
{

	while(1)
	{
	
	if(count==2)
	{
		fputc('B',stdout);
		count=3;
	
	}
	}



}
void *task3(void *a)
{
	while(1)
	{
		if(count==3)
		{
		fputc('C',stdout);
		count=1;
		}
	}


}
int main(int argc, const char *argv[])
{

	//创建线程
	pthread_t tid1=0;
	pthread_t tid2=0;
	pthread_t tid3=0;


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

	//回收线程
	pthread_detach(tid1);
	pthread_detach(tid2);
	pthread_detach(tid3);

	while(1)


	
	return 0;
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值