思维导图
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;
}