zoukankan      html  css  js  c++  java
  • 进程间通信之 信号量

    定义:信号量是一个计数器,用于多进程对共享数据对象的存取访问控制。为了获得共享资源,进程需要执行下列操作

    信号量使用步骤:

    1:初始化信号量---->int sem_init(sem_t *sem, int pshared, unsigned int value);

    2:申请资源,并对信号量做减一操作----->int sem_wait(sem_t *sem);

    3:释放资源,并对信号量做加一操作------>int sem_post(sem_t *sem);

     测试程序

    #include <sys/types.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
    #include <stdio.h>
    #include <pthread.h>
    #include <semaphore.h>

    int num = 0;

    void *func1(void *sem)
    {
        int sval;
        srand((unsigned)time(0));
        while(1)
        {
            int r = rand() % 3;
            sleep(r);
            if(0 == sem_wait(sem))
            {
                num++;
                printf("1 get it ");
            }
            sleep(r);
            printf("1 pass the ball ");
            sem_post(sem);
        }
    }

    void *func2(void *sem)
    {
        int sval;
        srand((unsigned)time(0));
        while(1)
        {
            int r = rand() % 3;
            sleep(r);
            if(0 == sem_wait(sem))
            {
                num++;
                printf("2 get it ");
            }
            sleep(r);
            printf("2 pass the ball ");
            sem_post(sem);
        }
    }

    void *func3(void *sem)
    {
        int sval;
        srand((unsigned)time(0));
        while(1)
        {
            int r = rand() % 3;
            sleep(r);
            if(0 == sem_wait(sem))
            {
                num++;
                printf("3 get it ");
            }
            sleep(r);
            printf("3 pass the ball ");
            sem_post(sem);
        }
    }

    int main()
    {
        sem_t sem;
        int pshared = 1;
        pthread_t tid;
        pthread_attr_t attr;       
        sem_init(&sem,pshared,1);
        if(0 != pthread_attr_init(&attr))
            perror("pthread_attr_init");
        pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);  //设置分离属性
        printf("start ");
        if(0 != pthread_create(&tid,&attr,func1,&sem))               
            perror("pthread_create");
        if(0 != pthread_create(&tid,&attr,func2,&sem))              
            perror("pthread_create");
        if(0 != pthread_create(&tid,&attr,func3,&sem))               
            perror("pthread_create");
        while(1)
        {
            if(30 == num)
            {
                break;
                printf("finshed ");
            }
        }
        return 0;
    }

  • 相关阅读:
    CentOS安装配置ganglia
    k-means聚类算法
    SharePoint solution and feature management with PowerShell
    EM算法
    极客”一词,来自于美国俚语“geek”的音译,一般理解为性格古怪的人
    学习游戏要学习编程语言吗?十大主流编程语言解析
    platform_device与platform_driver
    《用户体验要素》澄清了 UI 原型设计中看不见确感受得到的那一层
    ipconfig /flushdns 清除系统DNS缓存
    typedef和define具体的具体差别
  • 原文地址:https://www.cnblogs.com/be-m/p/4270862.html
Copyright © 2011-2022 走看看