進執行緒通訊之有名訊號量

2021-09-20 23:31:49 字數 2316 閱讀 8522

有名訊號量 semphore

如果說訊號是外部事件和程序的關聯的機制的話,那麼訊號量就是程序、執行緒之間通訊的機制。根據是支援不同程序之間的通訊還是同乙個程序內不同執行緒的通訊,訊號量可以分為有名訊號量和無名訊號量。顧名思義,有名訊號量在建立起來時需要顯式地指名乙個訊號量的名字,在linux這個名字對應到/dev/shm-semphorename這個共享記憶體的對映檔案,由於它可以被不同程序同時訪問,因而可以在不同程序之間實現通訊;而無名訊號僅僅用在同乙個程序內部的不同執行緒之間,由於不同執行緒共享建立它們的程序的資源,因而無需顯示地指定任何可以共同訪問的名稱或檔案。兩者的共同點是都支援經典的p/v操作,在申請訊號量的時候,如果申請不到可以被排程到休眠狀態,直至被v操作喚醒。

下面基於centos linux系統分別進行介紹有名訊號量和無名訊號量。

有名訊號量

依賴標頭檔案

#include /* for o_* constants */

#include /* for mode constants */

#include

常用函式

建立有名訊號量

sem_t *sem_open(const char *name, int oflag);

sem_t *sem_open(const char *name, int oflag,  mode_t mode, unsigned int value);

p操作int sem_wait(sem_t *sem); //如果訊號量不大於0,則當前執行緒或程序一直阻塞到訊號量大於0

int sem_trywait(sem_t *sem);//如果訊號量不大於0,返回出錯值並不會阻塞當前執行緒或程序

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);//如果訊號量不大於0,當前執行緒或程序會被阻塞abs_timeout指定的時間,然後繼續進入執行佇列

v操作int sem_post(sem_t *sem);

關閉訊號

int sem_close(sem_t *sem); //使得系統允許任何為這個訊號量申請的任何資源可以被釋放

int sem_unlink(sem_t *sem);//刪除sem指向的有名訊號量

查詢當前訊號量的值

int sem_getvalue(sem_t *sem, int *sval);//把當前訊號量的值讀取到sval當中去。

連線依賴庫

依賴於執行緒庫,在鏈結的時候需要加上-lpthread。

**例項:sem_svc.c

#include

#include

#include

#include

#include

#include

#include

#include

#include /* for o_* constants */

#include /* for mode constants */

#include

const char * fname = "tstmy";

void main(void)

sem_clnt.c:

#include

#include

#include

#include

#include

#include

#include

#include

#include /* for o_* constants */

#include /* for mode constants */

#include

const char * fname = "tstmy";

sem_t * clnt_sem;

void state_thread()

}  void main(void)

}編譯鏈結如下:

[xmch@localhost testcases]$ gcc -o sem_svc sem_svc.c -lpthread

[xmch@localhost testcases]$ gcc -o sem_clnt sem_clnt.c -lpthread

典型應用場景:

1.基於它實現多個程序之間的讀寫鎖/或者生產者消費者模型;

2.需要實現屬於不同程序的多個執行緒之間的通訊同步關係;

注意:上面例項**sem_svc.c中的sem_close()和sem_unlink不能忽略掉,否則下次執行執行到sem_open()時候會出錯,務必引起重視,特別地在多執行緒、程序的環境下,這兩個函式建議放在系統或者模組的清理函式(de-init或者destruct)中去執行。

多執行緒通訊 訊號量

當當前資源的數量大於0的時候,等待訊號量的執行緒可以獲得乙個資源並繼續執行,訊號量的當前資源數量將減1,如果當前資源的數量為0,則等待訊號量的執行緒將處於等待狀態,直到有執行緒釋放訊號量,使訊號量標識的資源數量大於0 handle createsemaphore lpsecurity attribu...

訊號量通訊

linux程序間通訊 使用訊號 下面就進入訊號量的講解。一 什麼是訊號量 為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行。而訊號量就可以提供這...

程序間通訊 POSIX 有名訊號量與無名訊號量

在 posix 系統中,程序間通訊是乙個很有意思的話題。posix訊號量程序是3種 ipc inter process communication 機制之一,3種 ipc 機制源於 posix.1 的實時擴充套件。single unix specification 將3種機制 訊息佇列,訊號量和共享...