POSIX訊號量——匿名訊號量
阿新 • • 發佈:2021-01-17
目錄
POSIX
- POSIX 訊號量有兩種型別:匿名訊號量和命名訊號量,其本質是計數型訊號量,計數型訊號量參考:https://blog.csdn.net/Liangren_/article/details/108593071。
- 匿名訊號量只存在於記憶體中,這就要求使用訊號量的執行緒必須可以訪問記憶體,因此匿名訊號量可以應用於同一程序中執行緒間的通訊,不同的程序間需要對映這段記憶體到自己的地址空間。
- 命名訊號量可以通過名字訪問,因此可以應用於程序間的通訊。
sem_t sem;
1、Creat
一個 POSIX 匿名訊號量必須要呼叫 sem_init 函式建立之後才能使用。#include <semaphore.h>
int sem_init(sem_t *psem, int pshared, unsigned int value);
函式 sem_init 原型分析:
- 此函式成功返回 0,失敗返回-1 並設定錯誤號;
- 輸出引數 psem 返回 POSIX 訊號量的指標;
- 引數 pshared
標識了 POSIX 訊號量是否程序共享(SylixOS 未用此項);- 引數 value 是 POSIX 訊號量的初始值。
2、Wait
執行緒如果需要等待一個 POSIX 訊號量,可以呼叫 sem_wait 函式,中斷服務程式不能呼叫任何的 POSIX 訊號量 API。釋放一個訊號量使用 sem_post 函式。#include <semaphore.h> int sem_wait(sem_t *psem); int sem_trywait(sem_t *psem); int sem_timedwait(sem_t *psem, const struct timespec *abs_timeout); int sem_reltimedwait_np(sem_t *psem, const struct timespec *rel_timeout);
以上幾個函式原型分析:
- 函式成功返回 0,失敗返回-1 並設定錯誤號;
- 引數 psem 是 POSIX 訊號量的指標;
- 引數 timeout 是等待的絕對超時時間;
- 引數 rel_timeout 是等待的相對超時時間。
sem_trywait 是 sem_wait 的“嘗試等待”版本,在 POSIX 訊號量的值為 0 時, sem_wait將阻塞直至被喚醒,而 sem_trywait 將立即返回。
sem_timedwait 是 sem_wait 的帶等待超時時間的版本, timeout 為等待的絕對超時時間,用時在當前時間的基礎上再加上一個相對超時時間就能得到絕對超時時間 timeout,如:
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 1;
sem_timedwait(&sem, &ts);
sem_reltimedwait_np 是 sem_timedwait 的非 POSIX 標準版本,引數 rel_timeout 為等待的相對超時時間,如:
struct timespec ts;
ts.tv_sec = 1;
ts.tv_nsec = 0;
sem_reltimedwait_np(&sem, &ts);
可以看出在使用上,sem_reltimedwait_np 比 sem_timedwait 更方便。
3、Post
#include <semaphore.h>
int sem_post(sem_t *psem);
函式 sem_post 原型分析:
- 此函式成功返回 0,失敗返回-1 並設定錯誤號;
- 引數 psem 是 POSIX 訊號量的指標。
4、GetValue
sem_getvalue 函式可以用來檢索訊號量值。需要注意的是,我們試圖要使用剛讀出來的 值的時候,訊號量值可能已經變化了,除非使用其他同步機制來避免這種競爭,否則 sem_getvalue 函式不建議使用。#include <semaphore.h>
int sem_getvalue(sem_t *psem, int *pivalue);
函式 sem_getvalue 原型分析:
- 此函式成功返回 0,失敗返回-1 並設定錯誤號;
- 引數 psem 是 POSIX 訊號量的指標;
- 輸出引數 pivalue 用於接收 POSIX 訊號量的當前計數值。
5、Delete
當一個 POSIX 匿名訊號量使用完畢後(並確保以後也不再使用),應該呼叫 sem_destroy 函式刪除它, SylixOS 會回收該訊號量佔用的核心資源。#include <semaphore.h>
int sem_destroy(sem_t *psem);
函式 sem_destroy 原型分析:
- 此函式返回錯誤號;
- 引數 psem 是 POSIX 訊號量的指標;