Linux——線程 四 (信號量)


線程中的信號量和進程中的信號量的作用相同,都是用於同步操作,達到無衝突的訪問共享資源的目的。但是它們也是有一定的區別的。

線程中的信號量通過參數的不同,也可以在進程間使用。
和semget() 函數創建的信號量不同,線程中的信號量可以使兩個線程進行同步。

我們先看一下線程中信號量的API及其參數:

 #include <semaphore.h>

1.定義信號量 sem_t sem

2.初始化信號量 sem_init(sem_t *sem,
                int shared,  //0表示進程內多線程使用
                int val)//信號量初值

3.PV:   int sem_wait(sem_t *sem)  //sem--;如果小於0,阻塞
        int sem_post(sem_t *sem)  //sem++

4.銷燬:int sem_destroy(sem_t *sem);

例子:通過兩個線程分別打印12,線程1打印1,線程2打印2
代碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>
#include<semaphore.h>


pthread_mutex_t mutex;

sem_t sem_full;
sem_t sem_empty;

void *rout1(void *arg)
{
    while(1)
    {
        //sem_full不爲0 不阻塞,sem_full--
        sem_wait(&sem_full);
        pthread_mutex_lock(&mutex);

        printf("1");
        fflush(stdout);
        sleep(1);
        pthread_mutex_unlock(&mutex);
        //empty++
        sem_post(&sem_empty);
    }
    return NULL;
}

void *rout2(void *arg)
{
    while(1)
    {
        //如果屏幕爲佔用,即sem_empty爲0   阻塞
        sem_wait(&sem_empty);
        pthread_mutex_lock(&mutex);

        printf("2");
        fflush(stdout);
        sleep(1);
        pthread_mutex_unlock(&mutex);
        //sem_full++
        sem_post(&sem_full);
    }
}

int main()
{
    pthread_t tid1,tid2;

    //初始化sem_full爲1,共享變量屏幕1
    sem_init(&sem_full,0,1);
    sem_init(&sem_empty,0,0);

    pthread_mutex_init(&mutex,NULL);

    pthread_create(&tid1,NULL,rout1,NULL);
    pthread_create(&tid2,NULL,rout2,NULL);

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_mutex_destroy(&mutex);

    return 0;
}

運行結果:
這裏寫圖片描述

信號量爲1,即一個屏幕。通過信號量,同步完成打印12數字。

POSIX信號量和 SystemV信號量,不同的就是:POSIX信號量可以進行同步操作。相比較一下,POSIX信號量更容易使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章