• 【操作系统】之进程(线程)同步


    生产者消费者主要解决----同步

    生产者消费者

    1、信号量的考虑

    这里使用3个信号量,其中两个信号量 empty 和 full 分别用于解决生产者和消费者线程之间的同步问题, mutex 是用于这两个线程之间的互斥问题。其中 empty 初始化为 N (缓冲区的空单元数), mutex 初始化为1, full初始化为0。

    2、流程图

    • 开始→建立有名管道→打开有名管道→初始化三个信号量→创建消费者和生产者两个线程

    • 生产者线程: wait 操作( empty )→ wait 操作( mutex )→读管道→ signal 操作( full )→ signal 操作( mutex )

    • 消费者线程: wait 操作( full )→ wait 操作( mutex )→写管道→ signal 操作( empty )→ signal 操作( mutex )

    3.编译

    gcc tongbu -o -lpthread -lpthread//线程库

    4.代码

     #include
     #include
     #include
     #include
     #include
     #include
     #include
     #include
     #include
     ​
     #define FIFO "myfifo"
     #define N 5
     ​
     int lock_var;
     time_t end_time;
     char buf_r[100];
     sem_t mutex,full,empty;
     int fd;//文件操作符
     ​
     void productor(void * arg);//生产者
     void consumer(void * arg);//消费者
     ​
     int main(int argc,char * argv[])
     {
         pthread_t id1,id2;//线程标识符
         pthread_t mon_th_id;
         int ret;
         end_time=time(NULL)+3;//程序运行时间
         
         if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
             printf("cannot creat fifoserver\n");
         printf("Preparing for reading bytes \n");
         memset(buf_r,0,sizeof(buf_r));//把buf_r清0,附上大小
         
         fd=open(FIFO,O_RDWR|O_NONBLOCK,0);
         if(fd==-1)
         {
             perror("open");
             exit(1);
         }
         ret=sem_init(&mutex,0,1);//信号量初始化
         ret=sem_init(&empty,0,N);
         ret=sem_init(&full,0,0);
         if(ret!=0)
         {
             perror("sem_init");
         }
         ret=pthread_create(&id1,NULL,(void*)productor,NULL);//线程创建(参数1:线程标识符,2:空,3:线程实体,4:空)
         if(ret!=0)
             perror("pthread cread1");
         ret=pthread_create(&id2,NULL,(void*)consumer,NULL);
         if(ret!=0)
             perror("pthread cread2");
         pthread_join(id1,NULL);//等待线程结束
         pthread_join(id2,NULL);
         exit(0);
     }
     ​
     ​
     void  productor(void * arg)
     {
         int i,nwrite;
         while(time(NULL)

    如果把 ret=pthread_create(&id1,NULL,(void*)consumer,NULL);改成 ret=pthread_create(&id1,NULL,(void*)productor,NULL);,结果只会是 Preparing for reading bytes因为只生产不消费不能发生同步。

  • 相关阅读:
    财务RPA与数字化转型——财务RPA如何促进企业的数字化转型
    Flutter高仿微信-第51篇-群聊-修改群名
    MATLAB入门教程005||MATLAB运算符||MATLAB算术运算
    AndroidJetpack应用指南学习笔记13--DataBinding的简单使用
    第4章SpringBoot ⽇志
    【深入浅出玩转FPGA9------经验点滴】
    变量和变量命名规则
    Java开发中Word转PDF文件5种方案横向评测
    谷歌公开自动驾驶新专利:通过眼睛注视向量,精确判断注意力
    异硫氰酸荧光素FITC标记二氧化钛纳米粒纳米颗粒CY7-Se-PEG-TiO2(定制服务)
  • 原文地址:https://blog.csdn.net/distant_Rove666/article/details/126512146