线程间通信与同步互斥1-flag
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
char str[]="123456";int flag=0;
void *callbackA(void *arg)
{
while(1)
{
if(flag==1)
{
printf("str=%s\n",str);
flag=0;
}
}
pthread_exit(NULL);
}
void *callbackB(void *arg)
{
char temp=0;
while(1)
{
if(flag==0)
{
int i=0;
while(i<3)
{
temp=str[i];
str[i]=str[5-i];
str[5-i]=temp;
i++;
}
flag=1;
}
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
printf("程序开始运行\n");
pthread_t tid1;
pthread_t tid2;
if(pthread_create(&tid1, NULL,callbackA,NULL)!=0)
{
perror("pthreadA");
return -1;
}
if(pthread_create(&tid2, NULL,callbackB,NULL)!=0)
{
perror("pthreadB");
return -1;
}
printf("线程创建成功\n");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
result
线程间互同步互斥 --互斥锁
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
char str[]="123456";int flag=0;
pthread_mutex_t mutex;
int size=0;
void *callbackA(void *arg)
{
int *fd1=(int*)arg;
int *fd2=(int*)arg+1;
char c=0;
pthread_mutex_lock(&mutex);
lseek(*fd1,0,SEEK_SET);
lseek(*fd2,0,SEEK_SET);
int i=0;
for(i=0;i<size/2;i++)
{ int res=read(*fd1,&c,1);
if(res<=0){break;}
write(*fd2,&c,1);
}
printf("上半部分打印成功\n");
printf("上半部分:fd1=%d,fd2=%d\n",*fd1,*fd2);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *callbackB(void *arg)
{
int *fd1=(int*)arg;
int *fd2=(int*)arg+1;
char c=0;
pthread_mutex_lock(&mutex);
int i=0;
lseek(*fd1,size/2,SEEK_SET);
lseek(*fd2,size/2,SEEK_SET);
printf("size=%d",size);
for(i=size/2;i<size+1;i++)
{
int res=read(*fd1,&c,1);
if(res<=0)break;
write(*fd2,&c,1);
}
printf("下半部分打印成功\n");
printf("下半部分:fd1=%d,fd2=%d\n",*fd1,*fd2);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
printf("程序开始运行\n");
if(pthread_mutex_init(&mutex,NULL)!=0)
{
perror("mutex");
return -1;
}
int fd1=open("./origin.png",O_RDONLY);
if(fd1<0){perror("open_fd1");return -1;}
int fd2=open("./copy.png",O_WRONLY|O_CREAT|O_TRUNC,0777);
if(fd2<0){perror("open_fd2");return -1;}
size = lseek(fd1,0,SEEK_END);
int fd[2]={fd1,fd2};
printf("主程序:fd1=%d,fd2=%d",fd1,fd2);
pthread_t tid1;
pthread_t tid2;
if(pthread_create(&tid1, NULL,callbackA,(void*)fd)!=0)
{
perror("pthreadA");
return -1;
}
if(pthread_create(&tid2, NULL,callbackB,(void*)fd)!=0)
{
perror("pthreadB");
return -1;
}
printf("线程创建成功\n");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
close(fd1);
close(fd2);
pthread_mutex_destroy(&mutex);
return 0;
}
result