天天看點

i.MX6ULL開發闆線程同步POSIX無名信号量

為保證每個線程對同一資源通路有效,比如一個線程想要從共享資源讀資料,而這些資源正在被其他線程修改,那麼讀出來的資料是無效的,那麼就要想辦法讓其他線程修改完再去讀,這時候就用到了同步機制。可以使用Linux系統提供的機制來對線程通路資源的順序進行同步,本文檔挑選了信号量,互斥鎖,條件變量來介紹線程同步機制,實驗代碼在sync/目錄下。

1 POSIX無名信号量

本章介紹POSIX 無名信号量,以下簡稱信号量。信号量類似于計數器,操作方法和前面的System V 信号燈基本一樣。

使用信号量的步驟:

1.在程式全局區定義信号量;

2.使用seminit()初始化信号量;

3.使用sem_wait()和sem_post()對信号量進行P/V操作;

4.使用sem_destroy()銷毀信号量。

信号量常用函數如下:

sem_init():對信号量值進行初始化,

#include

int sem_init(sem_t *sem, int pshared, unsigned int value);

參數含義:

sem:指針,指向定義的信号量;

pshared:指明這個信号量用于程序還是線程,0為線程,不等于0為程序,本節填寫為0。

value:信号量初始值

傳回值:成功傳回0,錯誤傳回-1。

sem_wait():等待一個信号量,進行P操作,信号量值-1;

sem_post():喚醒一個信号量,進行V操作,信号量值+1,定義如下:

#include

int sem_wait(sem_t *sem);

int sem_post(sem_t *sem);

參數含義:

sem:要操作的信号量;

傳回值:成功傳回0,錯誤傳回-1。

sem_destroy():銷毀初始化後的信号量

#include

int sem_destroy(sem_t *sem);

sem:要操作的信号量;

傳回值:成功傳回0,錯誤傳回-1。

實驗代碼在sync/sem.c:路徑為:11_Linux系統開發進階\Linux系統程式設計_章節使用資料。

使用信号量控制讀寫線程,初始化時寫信号量為1,讀信号量為0,那麼讀線程就會阻塞,寫線程就會執行并将寫信号-1,寫線程在fgets等待輸入,當輸入完成後,将讀信号+1喚醒讀線程,這樣讀寫線程交替執行就完成了同步。

i.MX6ULL開發闆線程同步POSIX無名信号量
i.MX6ULL開發闆線程同步POSIX無名信号量
i.MX6ULL開發闆線程同步POSIX無名信号量

繼續閱讀