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;
    }

  • 相关阅读:
    于丹关于人性的总结
    Oracle中的MS SQLSERVER@@ERROR
    分享2011年10月网上随机搜集的超酷超有趣的web开发和Javascript代码
    来自Nike Better World的视差滚动(Parallax Scrolling)特效 分享一些教程和灵感
    2011年最新使用CSS3实现各种独特悬浮效果的教程
    分享2011年50个最棒的wordpress主题 第一部分
    分享2011年50个最棒的wordpress主题
    分享一个超酷创建互动文档的Javascript类库 tangle
    jQuery Howto: 如何快速创建一个AJAX的"加载"的图片效果
    什么时候我们该选择VPS服务器?
  • 原文地址:https://www.cnblogs.com/be-m/p/4270862.html
Copyright © 2011-2022 走看看