1. 使用两个线程完成两个文件的拷贝,分支线程1完成前一半内容拷贝,分支线程2完成后一半内容的拷贝,主线程完成资源的回收
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
int fork1(const char *argv[],int len);
int get_file_len(const char * srcFile);
int create_desc_file(const char * descFile);
int file_copy(const char * srcFile,const char * descFile,int start,int len);
int threadTask(const char *argv[],int len);
void * file_thread_copy(void *arg);
typedef struct fileInfo{
const char *srcFile; //源文件路径
const char *descFile; //目标文件路径
int start;//开始
int len;//写的长度
} file,*fileInfo_p;
//主程序
int main(int argc, const char *argv[])
{
if(argc != 3){
printf("please enter file");
return -1;
}
//定义源文件大小
int len = get_file_len(argv[1]);
create_desc_file(argv[2]);
//进程实现
//fork1(argv,len);
//线程实现
threadTask(argv,len);
return 0;
}
int threadTask(const char *argv[],int len){
//创建线程1
pthread_t tid1 =-1;
//结构体初始化
file buf = {argv[1],argv[2],0,len/2};
if(pthread_create(&tid1,NULL,file_thread_copy,&buf) !=0){
printf("fileInfo 线程1创建 error");
return -1;
}
printf("线程1 拷贝完成\n");
//创建线程2
pthread_t tid2 = -1;
//结构体2初始化
file buf2 = {argv[1],argv[2],len/2,len-len/2};
if(pthread_create(&tid2,NULL,file_thread_copy,&buf2)){
printf("fileInfo 线程2创建 error");
return -1;
}
printf("线程2 拷贝完成\n");
//线程回收(阻塞的形式)
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
}
//进程实现
int fork1(const char *argv[],int len){
pid_t pid1 = -1;
pid1 = fork();
//子进程1
if(pid1 == 0){
//前一半
file_copy(argv[1],argv[2],0,len/2);
printf("前一半拷贝完成\n");
exit(EXIT_SUCCESS);
}else if(pid1 > 0 ){
pid_t pid2 = -1;
pid2 = fork();
//子进程2
if(pid2 == 0){
file_copy(argv[1],argv[2],len/2,len-len/2);
printf("后一半拷贝完成\n");
exit(EXIT_SUCCESS);
}else if(pid2 > 0){
//在父进程中回收 进程
wait(NULL);
wait(NULL);
}else{
perror("fork 2 error");
return -1;
}
}else{
perror("fork 1 error");
return -1;
}
return 0;
}
int get_file_len(const char * srcFile){
//文件IO
int srcId;
if((srcId = open(srcFile,O_RDONLY)) == -1){
perror("srcFile open error");
return -1;
}
//得到文件大小
int len = lseek(srcId,0,SEEK_END);
close(srcId);
return len;
}
int create_desc_file(const char * descFile){
int descId;
if((descId = open(descFile,O_RDONLY | O_CREAT|O_TRUNC,0664)) == -1){
perror("descFile1 open error");
return -1;
}
close(descId);
return descId;
}
int file_copy(const char * srcFile,const char * descFile,int start,int len){
//打开原文件
int srcId;
if((srcId = open(srcFile,O_RDONLY)) == -1){
perror("srcFile open error");
return -1;
}
//打开目标文件
int descId;
if((descId = open(descFile,O_WRONLY)) == -1){
perror("descFile2 open error");
return -1;
}
//控制光标
lseek(srcId,start,SEEK_SET);
lseek(descId,start,SEEK_SET);
char rea[100];
int res =0;
int sum =0;
while(1){
res = read(srcId,rea,sizeof(rea));
sum += res;
if(sum >= len || res ==0){
write(descId,rea,res-(sum -len));
//记得痛处循环
break;
}
//写文件
write(descId,rea,res);
}
//关闭文件
close(srcId);
close(descId);
}
void * file_thread_copy(void *arg){
//强转成结构体(指针)
fileInfo_p info = (fileInfo_p)arg;
file_copy(info->srcFile,info->descFile,info->start,info->len);
}
2. 互斥锁使用
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
int sum = 1000;
//定义互斥变量
pthread_mutex_t mu;
void * test(void * arg){
while(1){
//加锁
int aa = pthread_mutex_lock(&mu);
printf("aa %d\n",aa);
sum = sum -2;
printf("test sum = %d \n",sum);
//pthread_mutex_trylock(&mu);
//释放锁
pthread_mutex_unlock(&mu);
if(sum <=0){
printf("test - end \n");
break;
}
sleep(1);
}
}
int main(int argc, const char *argv[])
{
//互斥变量初始化
pthread_mutex_init(&mu,NULL);
pthread_t pid = -1;
if(pthread_create(&pid,NULL,test,NULL) != 0){
printf(" thread create error \n ");
return -1;
}
while(1){
//加锁
pthread_mutex_lock(&mu);
sum = sum -3;
printf("main sum = %d \n",sum);
//释放锁
pthread_mutex_unlock(&mu);
if(sum <=0){
printf("main - end \n");
break;
}
sleep(1);
}
//回收子进程
pthread_join(pid,NULL);
pthread_mutex_destroy(&mu);
return 0;
}
3. 思维导图