linux C sem 信号量

参考:http://www.cnblogs.com/eleclsc/p/5838790.html

linux 下线程同步的方法:

一、互斥锁

二、条件变量

三、信号量

条件变量在上一篇中已经做了些了解,在这里将记录我对信号量的使用以及理解。

在解决 多个线程轮流打印 字符的程序中,我最开始静静只是知道使用全局变量通过循环阻塞的 方式完成。不过经过一些查找资料学习,上一篇中我初步了解了使用条件变量实现那个功能。然后在学习过程中发现linux 还能通过信号量的方式完成线程同步的功能。

信号量基本方法以及概念直接引用过来:

  如同进程一样,线程也可以通过信号量来实现通信,虽然是轻量级的。信号量函数的名字都以"sem_"打头。线程使用的基本信号量函数有四个。

    1. 信号量初始化。
      int sem_init (sem_t *sem , int pshared, unsigned int value);
      这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。
    2. 等待信号量。给信号量减1,然后等待直到信号量的值大于0。
      int sem_wait(sem_t *sem);
    3. 释放信号量。信号量值加1。并通知其他等待线程。
      int sem_post(sem_t *sem);
    4. 销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。
      int sem_destroy(sem_t *sem);

看过信号量的基本使用方法,我发现这个方法要比条件变量更简单。然后就是继续代码实现了

#include<semaphore.h>
#include<pthread.h>
#include<stdio.h>

const int count=10;

sem_t sem1,sem2,sem3;


void init_info()
{
    sem_init(&sem1,0,1);
    sem_init(&sem2,0,0);
    sem_init(&sem3,0,0);
}

void destroy_info()
{
    sem_destroy(&sem1);
    sem_destroy(&sem2);
    sem_destroy(&sem3);
}

void *pth1(void *arg)
{
    int i=count;
    while(i--){
    
        sem_wait(&sem1);
        printf("A %d\n",i);
        sem_post(&sem2);
    
    }
}

void *pth2(void *arg)
{
    int i=count;
    while(i--){
    
        sem_wait(&sem2);
        printf("B %d\n",i);
        sem_post(&sem3);
    
    }
}

void *pth3(void *arg)
{
    int i=count;
    while(i--){
    
        sem_wait(&sem3);
        printf("C %d\n",i);
        sem_post(&sem1);
    
    }
}


int main()
{
    init_info();
    
    pthread_t pid1,pid2,pid3;
    pthread_create(&pid1,NULL,pth1,NULL);
    pthread_create(&pid2,NULL,pth2,NULL);
    pthread_create(&pid3,NULL,pth3,NULL);

    pthread_join(pid1,NULL);
    pthread_join(pid2,NULL);
    pthread_join(pid3,NULL);
    
    destroy_info();
    return 0;
}

 

posted on 2017-04-11 15:55  Just_Boy  阅读(477)  评论(0)    收藏  举报