?
从写互斥锁
#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;
}
?