zoukankan      html  css  js  c++  java
  • 临界区的同步操作-------------使用信号量 实现

                       同步模型: 

                 

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <pthread.h>
    #include <semaphore.h>
    
    //#define	EXIT_SUCCESS	0
    //#define	EXIT_FAILURE	1
    //假设有6个同学{姜涵,张柏芝,刘思思,孙燕姿,赵敏,马苏},依次按照顺序报数
    //f(x) = f(x+6)   周期性
    // 关键是理解 临界区需要怎么去操作   选择什么样技术
    
    static int  pthread_run = 1;
    static void  print(char*s);
    static sem_t sem[6];
    //sem_init(&sem, 0, 0)
    
    static void* J_H_Pthread(void *arg)
    {
        int a ;
        while(pthread_run)
        {
           //printf("pthread run
    ");
           sem_wait(&sem[0]);
           print(__func__);
           sem_post(&sem[1]);
    
        }
    
        return (void*)NULL;
    }
    
    static void* Z_B_Z_Pthread(void *arg)
    {
        int a ;
        while(pthread_run)
        {
           //printf("pthread run
    ");
           sem_wait(&sem[1]);
           print(__func__);
           sem_post(&sem[2]);
    
        }
    
        return (void*)NULL;
    }
    
    static void* L_S_SPthread(void *arg)
    {
        int a ;
        while(pthread_run)
        {
           //printf("pthread run
    ");
           sem_wait(&sem[2]);
           print(__func__);
           sem_post(&sem[3]);
    
        }
    
        return (void*)NULL;
    }
    
    static void* S_Y_Zthread(void *arg)
    {
        int a ;
        while(pthread_run)
        {
           //printf("pthread run
    ");
           sem_wait(&sem[3]);
           print(__func__);
           sem_post(&sem[4]);
    
        }
    
        return (void*)NULL;
    }
    
    static void* Z_M_Pthread(void *arg)
    {
        int a ;
        while(pthread_run)
        {
           //printf("pthread run
    ");
           sem_wait(&sem[4]);
           print(__func__);
           sem_post(&sem[5]);
    
        }
    
        return (void*)NULL;
    }
    
    static void* M_S_Pthread(void *arg)
    {
        int a ;
        while(pthread_run)
        {
           //printf("pthread run
    ");
           sem_wait(&sem[5]);
           print(__func__);
           sem_post(&sem[0]);
        }
    
        return (void*)NULL;
    }
    
    // 定义一个临界区资源
    static void  print(char*s)
    {
       if(s==NULL)
       {
          printf("int value error
    ");
          return 0;
       }
       printf("I'm here %s
    ",s);
    }
    
    int main()
    {
    
    
        printf("EXIT_SUCCESS is %d
    ",EXIT_SUCCESS);
        printf("EXIT_FAILURE is %d
    ",EXIT_FAILURE);
        int ret = -1;
        pthread_t  j_h_ptid,z_b_ztid,l_s_stid,s_yztid,z_mtid,m_stid;
        //int ret = pthread_create(&tid,NULL,Noise_USB_Pthread,NULL);
        //printf("ret is %d
    ",ret);
        //ret = pthread_join(tid,NULL);
        //printf("ret is %d
    ",ret);
        int i;
        for(i =0;i<6;i++)
        {
            if(i==0)
              sem_init(&sem[i],0,1);
            else
              sem_init(&sem[i],0,0);
        }
    
        ret = pthread_create(&j_h_ptid,NULL,J_H_Pthread,NULL);
        printf("ret is %d
    ",ret);
        ret = pthread_create(&z_b_ztid,NULL,Z_B_Z_Pthread,NULL);
        printf("ret is %d
    ",ret);
        ret = pthread_create(&l_s_stid,NULL,L_S_SPthread,NULL);
        printf("ret is %d
    ",ret);
        ret = pthread_create(&s_yztid,NULL,S_Y_Zthread,NULL);
        printf("ret is %d
    ",ret);
        ret = pthread_create(&z_mtid,NULL,Z_M_Pthread,NULL);
        printf("ret is %d
    ",ret);
        ret = pthread_create(&m_stid,NULL,M_S_Pthread,NULL);
        printf("ret is %d
    ",ret);
    
        pthread_join(j_h_ptid,NULL);
        pthread_join(z_b_ztid,NULL);
        pthread_join(l_s_stid,NULL);
        pthread_join(s_yztid,NULL);
        pthread_join(s_yztid,NULL);
        pthread_join(m_stid,NULL);
    
        for(i =0;i<6;i++)
        {
            sem_destroy(&sem[i]);
        }
    
        while(1);
    
        return 0;
    }
    
    

      同步模型

    一勤天下无难事。
  • 相关阅读:
    【nodejs】vscode添加nodejs调试功能
    【nodejs】简单的httpserver
    windows下,强制关闭某端口号的进程
    git 客户端用户名密码配置
    【shell】变量替换
    aksk鉴权
    vue学习笔记-第一课
    好未来上海一面电面
    20190325面试题记录(中级java)
    IT帮-三月份-职业规划主题笔记
  • 原文地址:https://www.cnblogs.com/nowroot/p/13624225.html
Copyright © 2011-2022 走看看