线程同步——信号量

来源:互联网 发布:mac keynote 模板 编辑:程序博客网 时间:2024/06/05 21:13

看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。

那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。

第三个参数value表示可用的资源的数目,即信号灯的数目,咱们这儿只有1个打印机所以设成1。

然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。

第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。

最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。


#include <stdio.h> 

#include <stdlib.h>   

#include <unistd.h>   
#include <pthread.h>   
#include <semaphore.h>
 
int myglobal;  
sem_t sem;  
 
void * thread_function(void *arg)  
{  
    int i,j;  
    for (i = 0; i < 10; i += 1)  
    {  
        sem_wait(&sem);  
        j = myglobal;  
        j = j+1;  
        printf(".");  
        fflush(stdout);  
        sleep(1);  
        myglobal = j;  
        sem_post(&sem);  
    }  
    return NULL;  
}  
 
 
int main(void)  
{  
    pthread_t mythread;  
    int i;  
 
    sem_init(&sem, 0, 1);//信号量初始化   
    if(pthread_create(&mythread, NULL, thread_function, NULL))  
    {  
        printf("create thread error!\n");  
        abort();  
    }  
 
/*  sleep(1);*/  
 
    for(i = 0; i < 10; i++)  
    {  
        sem_wait(&sem);//=0   
        myglobal = myglobal + 1;  
        printf("o");  
        fflush(stdout);  
        sleep(1);  
        sem_post(&sem);//=1   
    }  
 
    if(pthread_join(mythread, NULL))  
    {  
        printf("waiting thread failed!\n");  
        abort();  
    }  
 
    printf("myglobal equals %d\n",myglobal);  
 
    exit(0);  
}
0 0