day5 线程通信

day5 线程通信_第1张图片

将互斥机制代码重新实现一遍

day5 线程通信_第2张图片

将同步机制代码重新实现一遍

day5 线程通信_第3张图片

使用三个线程完成两个文件的拷贝,线程1完成拷贝前一半,线程2完成拷贝后一半,主线程回收两个分支线程的资源

  1 #include
  2 sem_t sem;
  3 struct Info
  4 {
  5     int srcfd;
  6     int dstfd;
  7     int size;
  8 };
  9 //定义分支线程函数体
 10 void *task1(void *buf)
 11 {
 12     //不断得将源文件中的内容读出,并写入的目标文件中                                                                                                                                                       
 13     //直到源文件读取一半结束
 14     char buf1[1] = "";
 15     int count=0;
 16     lseek(((struct Info*)buf)->srcfd,0,SEEK_SET);
 17     while(1)
 18     {
 19         memset(buf1, 0, sizeof(buf1));    //将容器清空
 20         int res = read(((struct Info*)buf)->srcfd, buf1, sizeof(buf1));   //从源文件中读取数据
 21         count+=res;
 22         //对读取的数据个数进行判断
 23         if(count>((struct Info*)buf)->size/2)
 24         {
 25             break;
 26         }
 27         write(((struct Info*)buf)->dstfd, buf1, res);     //将数据写入目标文件
 28     }sem_post(&sem);
 29     pthread_exit(NULL);
 30 }
 31 void *task2(void *buf)
 32 {
 33     sem_wait(&sem);
 34     lseek(((struct Info*)buf)->srcfd,(((struct Info *)buf)->size)/2,SEEK_SET);
 35     //不断得将源文件中的内容读出,并写入的目标文件中
 36     //直到源文件读取后一半结束
 37     char buf2[128] = "";
 38     while(1)
 39     {
 40         memset(buf2, 0, sizeof(buf2));    //将容器清空
 41         int res = read(((struct Info *)buf)->srcfd, buf2, sizeof(buf2));   //从源文件中读取数据
 42         //对读取的数据个数进行判断
 43         if(res==0)
 44         {
 45             break;
 46         }
 47         write(((struct Info*)buf)->dstfd, buf2, res);     //将数据写入目标文件
 48     }
 49     pthread_exit(NULL);
 50 }
 51 int main(int argc, const char *argv[])
 52 {
 53     //判断传入的文件个数
 54     if(argc != 3)
 55     {
 56         printf("input file error\n");
 57         printf("usage:./a.out srcfile dstfile\n");
 58         return -1;
 59     }
 60     //定义文件描述符变量
 61     int srcfd, dstfd;
 62     //以只读的形式打开源文件
 63     if((srcfd = open(argv[1], O_RDONLY)) ==-1)
 64     {
 65         perror("open srcfile error");
 66         return -1;
 67     }
 68     //以只写的形式打开目标文件
 69     if((dstfd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0664)) ==-1)
 70     {
 71         perror("open dstfile error");
 72         return -1;
 73     }
 74     sem_init(&sem, 0, 0);
 75     unsigned int size;
 76     size = lseek(srcfd, 0, SEEK_END);
 77     struct Info buf = {srcfd, dstfd, size};
 78     //定义一个线程号变量
 79     pthread_t tid1,tid2;
 80     //创建出一个分支线程
 81     if(pthread_create(&tid1, NULL, task1, &buf) != 0)
 82     {
 83         printf("tid create error\n");
 84         return -1;
 85     }
 86     if(pthread_create(&tid2, NULL, task2, &buf) != 0)
 87     {
 88         printf("tid create error\n");
 89         return -1;
 90     }
 91     pthread_join(tid1, NULL);
 92     pthread_join(tid2, NULL);
 93     sem_destroy(&sem);
 94     close(srcfd);
 95     close(dstfd);
 96     return 0;
 97 }

day5 线程通信_第4张图片

使用三个线程完成:线程1输出字符'A',线程2输出字符'B',线程3输出字符'C',要求输出结果为:ABCABCABCABCABC...

  1 #include
  2 //1、创建一个无名信号量
  3 sem_t sem;
  4 //定义一个标志控制线程顺序
  5 int flag=0;
  6 void *task1(void *arg)
  7 {
  8     while(1)
  9     {
 10         if(flag==0)
 11         {
 12             printf("A");
 13             flag=1;
 14         }
 15         //4、释放资源
 16         sem_post(&sem);
 17     }
 18 }
 19 void *task2(void *arg)
 20 {
 21     while(1)
 22     {
 23         //3、申请资源,如果没有资源,则在该处阻塞
 24         sem_wait(&sem);
 25         if(flag==1)
 26         {
 27             printf("B");
 28             flag=2;
 29         }
 30         //4、释放资源
 31         sem_post(&sem);
 32     }
 33 }
 34 void *task3(void *arg)
 35 {
 36     while(1)
 37     {
 38         //3、申请资源,如果没有资源,则在该处阻塞
 39         sem_wait(&sem);
 40         if(flag==2)
 41         {
 42             printf("C");
 43             flag=0;
 44         }
 45     }
 46 }
 47 int main(int argc, const char *argv[])
 48 {
 49     //创建三个线程
 50     pthread_t tid1,tid2,tid3;
 51     //2、初始化无名信号量
 52     sem_init(&sem, 0, 0);
 53     //创建A线程
 54     if(pthread_create(&tid1, NULL, task1, NULL) != 0)
 55     {
 56         printf("tid1 create error\n");
 57         return -1;
 58     }
 59     //创建B线程
 60     if(pthread_create(&tid2, NULL, task2, NULL) != 0)
 61     {
 62         printf("tid2 create error\n");
 63         return -1;
 64     }
 65     //创建C线程
 66     if(pthread_create(&tid3, NULL, task3, NULL) != 0)
 67     {
 68         printf("tid2 create error\n");
 69         return -1;
 70     }
 71     //主线程回收资源
 72     pthread_join(tid1, NULL);
 73     pthread_join(tid2, NULL);
 74     pthread_join(tid3, NULL);
 75     //5、销毁无名信号量
 76     sem_destroy(&sem);
 77     return 0;
 78 } 

你可能感兴趣的:(笔记)