第三季-第17课-信号量同步编程

Posted free-1122

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三季-第17课-信号量同步编程相关的知识,希望对你有一定的参考价值。

第17课-信号量同步编程

 

17.1 核心概念--进程同步

一组并发进程进行互相合作、互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步。

17.2 生产者消费者问题

1. 问题描述

这里面有两个角色:生产者和消费者。假设生产者生产的产品需要两步才能完成并且使用。但是,当生产者刚刚完成了对产品的第一步加工的时候,产品就被消费者买走了。可是他们之间并没有相应的沟通,这就导致,消费者会以为他买到了完成的产品。

2. 程序化

在文件夹里面创建producer.c和customer.c文件,同时创建文件夹ship。

producer.c

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

void main()

         int fd;

         //1.创建产品--文件

         fd = open("./product.txt",O_RDWR|O_CREAT,0775);

         //2.休息

         sleep(20);

         //3.向产品文件中填充内容

         write(fd,"the product is finished!",25);

         //4.关闭文件

         close(fd);

customer.c

#include<stdlib.h>

void main()

         //取走产品文件

         system("cp ./product.txt ./ship");

运行结果:在两个一样的终端中分别运行./producer和./customer文件,我们会在文件夹/ship中,找到空白的文件product.txt。

3. 加入同步控制量

我们设置信号量的初始值是0,只有当生产者完成程序运行的时候才是1,这样就能解决问题。

./producer.c

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

#include<sys/ipc.h>

#include<sys/sem.h>

void main()

         int fd;

         key_t key;

         int semid;

         struct sembuf sops;

         //键值的设置

         key = ftok("/root",2);

         //创建信号量

         semid = semget(key,1,IPC_CREAT);

         //设置初始值为0

         semctl(semid,0,SETVAL,0);

         //创建产品--文件

         fd = open("./product.txt",O_RDWR|O_CREAT,0775);

         //休息

         sleep(20);

         //向产品文件中填充内容

         write(fd,"the product is finished!",25);

         //关闭文件

         close(fd);

         //释放信号量

         sops.sem_num = 0 ;

         sops.sem_op = 1;

         sops.sem_flg = SEM_UNDO;

         semop(semid,&sops,1);

./customer

#include<stdlib.h>

#include<sys/ipc.h>

#include<sys/sem.h>

#include<sys/types.h>

void main()

         key_t key;

         int semid;

         struct sembuf sops;

         int ret;

         //键值的设置

         key = ftok("/root",2);

         semid = semget(key,1,IPC_CREAT);

         //获取信号量

         sops.sem_num = 0 ;

         sops.sem_op = -1;

         sops.sem_flg = SEM_UNDO;           /*缺少这一项,可能成功,也可能失败,这里要是不设置它,会失败*/

         //SEM_UNDO表示当程序,用这个信号量出错的时候,系统帮你释放掉这个信号量。

         ret = semop(semid,&sops,1);

         printf("ret is %d!\n",ret);   /*显示0表示成功,显示-1表示失败*/

         //取走产品文件

         system("cp ./product.txt ./ship");

运行结果:在两个一样的终端中分别运行./producer和./customer文件,我们会看到./customer程序的等待,我们还在/ship文件夹中找到文件product.txt,它里面的内容是:the product is finished!

 

以上是关于第三季-第17课-信号量同步编程的主要内容,如果未能解决你的问题,请参考以下文章

第三季-第16课-信号量互斥编程

王者并发课-铂金4:令行禁止-为何说信号量是线程间的同步利器

Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁信号量事件队列生产者消费者模型

第9章 线程编程_线程同步1:互斥锁

Python下进程同步之互斥锁信号量事件机制 -- 2019-08-16 17:58:28

李炎恢第三季视频教程 php设计模式 smarty 商城实战 李炎恢php教程全套 共172课包含源码课件