zoukankan      html  css  js  c++  java
  • 第三季-第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! ",ret);   /*显示0表示成功,显示-1表示失败*/

             //取走产品文件

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

    }

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

  • 相关阅读:
    Eclipse中SVN插件的安装方式
    Javascript实现DIV滚动自动滚动到底部
    Android程序开发的环境配置
    Android程序开发基础之——页面布局
    TinyMCE使用手册
    PHP中使用mktime获取时间戳的一个黑色幽默
    VS11本地IIS调试时(URL不使用虚拟目录,直接用localhost)
    [VS扩展工具] Image Optimizer(图像优化压缩)
    [程序安装包制作] Advanced Installer 备忘
    安装VS2010 SP1时遇到WCF RIA Service 版本错误
  • 原文地址:https://www.cnblogs.com/free-1122/p/11351543.html
Copyright © 2011-2022 走看看