Linux利用信號量實現線程的同步與互斥

線程使用互斥鎖可以實現線程間的互斥,而互斥鎖本身就是對資源的一種標識狀態,當可以申請到鎖時說明此時資源可以使用,當申請鎖失敗時說明資源此時被其他線程所佔用不可使用,我們可以使用信號量來代替互斥鎖實現。
信號量用來表示資源數目,當一個線程要去訪問資源時,必須先去申請信號量,如果可以獲取到信號量那麼該線程就可以正常運行,如果獲取資源失敗那麼就需要去等待。
當一個線程獲取到信號量並且執行完成後必須去釋放對應的信號量來通知其他線程進行工作,也就是說使用信號量不僅可以實現線程的互斥也可以實現線程間的同步。

信號量的操作:
①初始化
int sem_init(sem_t *sem, int pshared, unsigned int value);
參數描述:
sem:用來標識那個信號量,是一個sem_t類型的值
pshared:pshared爲0,表示信號量作用於同一進程下的線程間同步
value:信號量的初始值
返回值:
成功返回0, 失敗返回錯誤碼
②銷燬信號量
int sem_destroy(sem_t *sem);
參數描述:
sem:用來標識是哪個信號量
返回值;
成功返回0,失敗返回錯誤碼
③獲得資源操作(P操作)
int sem_wait(sem_t *sem);
函數說明:
wait操作,使信號量的值減1,如果已經是0,則該線程被掛起到等待隊列。
參數描述:
sem:用來標識啥事那個信號量
返回值:
成功返回0, 失敗返回錯誤碼
int sem_trywait(sem_t *sem);
該函數與上面的函數作用一樣,不過這個函數不會將線程掛起等待。
④釋放資源操作(V操作)
int sem_post(sem_t *sem);
函數說明:
psot操作,使信號量的值加1,同時喚醒等待該信號量的線程。
參數描述:
sem:標識是哪個信號量
返回值:
成功返回0, 失敗返回錯誤碼

實例:
將環形隊列設置爲緩衝區,生產者每生產一個數據放入到緩衝區中,消費者每次從緩衝區中讀出一個數據。
此時需要使用兩個信號量,一個用來表示環形隊列中空位置的數量,一個用來表示環形隊列中數據的數量。

生產者只有等到有空位置時才能生產數據,消費者只有等到有數據時才能取到數據

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

//用數組模擬環形隊列
int arr[8] = {0};
int i = 0;
int j = 0;
//設置信號量用來表示數組中的空位
sem_t blank;
//設置信號量用來表示數組中的數據
sem_t data;

void *product(void *arg)
{
    while(1)
    {
    //生產者要生產必須要有空位,不然只能等待消費者取走數據之後才能生產
    sem_wait(&blank);
    arr[i%8] = rand()%123;
    printf("生產者生產完成:%d\n", arr[i%8]);
    i++;
    //當生產成功時,數據量+1
    sem_post(&data);
    sleep(i%3);
    }
}

void *consumer(void *arg)
{
    while(1)
    {
    //消費者要消費必須有數據,不然只能等待生產者生產出數據之後才能取走
    sem_wait(&data);
    printf("消費者消費完成:%d\n", arr[j%8]);
    j++;
    //當消費成功時,空位量+1
    sem_post(&blank);
    sleep(j%5);
    }
}

int main()
{
    //最開始,有8個空位
    sem_init(&blank, 0, 8);
    //最開始,還沒有放入數據,數據爲0個
    sem_init(&data, 0, 0);
    pthread_t thread1;
    pthread_t thread2;

    pthread_create(&thread1, NULL, &product, NULL);
    pthread_create(&thread2, NULL, &consumer, NULL);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    sem_destroy(&blank);
    sem_destroy(&data);
    return 0;
}


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