Posix多執行緒程式設計學習筆記(三) 訊號燈(1)

2021-04-25 15:57:45 字數 3105 閱讀 4189

posix

有名訊號燈

函式sem_open

建立乙個新的有名訊號燈或開啟乙個已存在的有名訊號燈。有名訊號燈總是既可用於執行緒間的同步,又可以用於程序間的同步。

1.posix

有名訊號燈函式

1.名稱:

:sem_open

功能:建立並初始化有名訊號燈

標頭檔案:

#include

函式原形:

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

引數:name  

訊號燈的外部名字

oflag 

選擇建立或開啟乙個現有的訊號燈

mode

許可權位value

訊號燈初始值

返回值:

成功時返回指向訊號燈的指標,出錯時為

sem_failed

oflag

引數可以是0、

o_creat

(建立乙個訊號燈)或

o_creat|o_excl

(如果沒有指定的訊號燈就建立),如果指定了

o_creat

,那麼第三個和第四個引數是需要的;其中

mode

引數指定許可權位,

value

引數指定訊號燈的初始值,通常用來指定共享資源的書面。該初始不能超過

sem_value_max

,這個常值必須低於為

32767

。二值訊號燈的初始值通常為

1,計數訊號燈的初始值則往往大於1。

如果指定了

o_creat

(而沒有指定

o_excl

),那麼只有所需的訊號燈尚未存在時才初始化它。所需訊號燈已存在條件下指定

o_creat

不是乙個錯誤。該標誌的意思僅僅是「如果所需訊號燈尚未存在,那就建立並初始化它」。但是所需訊號燈等已存在條件下指定

o_creat|o_excl

卻是乙個錯誤。

sem_open

返回指向

sem_t

訊號燈的指標,該結構裡記錄著當前共享資源的數目。

/*semopen.c*/

#include

#include

#include

#include

#include

int main(int argc,char **argv)

sem=sem_open(argv[1],o_creat,0644,1);

exit(0);

}#gcc –lpthread –o semopen semopen.c

#./semopen

2.名稱::

sem_close

功能:關閉有名訊號燈

標頭檔案:

#include

函式原形:

int sem_close(sem_t *sem);

引數:sem

指向訊號燈的指標

返回值:

若成功則返回

0,否則返回-1。

乙個程序終止時,核心還對其上仍然開啟著的所有有名訊號燈自動執行這樣的訊號燈關閉操作。不論該程序是自願終止的還是非自願終止的,這種自動關閉都會發生。

但應注意的是關閉乙個訊號燈並沒有將它從系統中刪除。這就是說,

posix

有名訊號燈至少是隨核心持續的:即使當前沒有程序開啟著某個訊號燈,它的值仍然保持。

3.名稱::

sem_unlink

功能:從系統中刪除訊號燈

標頭檔案:

#include

函式原形:

int sem_unlink(count char *name);

引數:name 

訊號燈的外部名字

返回值:

若成功則返回

0,否則返回-1。

有名訊號燈使用

sem_unlink

從系統中刪除。

每個訊號燈有乙個引用計數器記錄當前的開啟次數,

sem_unlink

必須等待這個數為

0時才能把

name

所指的訊號燈從檔案系統中刪除。也就是要等待最後乙個

sem_close

發生。/*semunlink.c*/

#include

#include

#include

#include

#include

int main(int argc,char **argv)

if((sem_unlink(argv[1]))!=0)

perror(「sem_unlink」);

else

printf(「success」);

exit(0);}4.

名稱::sem_getvalue

功能:測試訊號燈

標頭檔案:

#include

函式原形:

int sem_getvalue(sem_t *sem,int *valp);

引數:sem

指向訊號燈的指標

返回值:

若成功則返回

0,否則返回-1。

sem_getvalue

在由valp

指向的正數中返回所指定訊號燈的當前值。如果該訊號燈當前已上鎖,那麼返回值或為

0,或為某個負數,其絕對值就是等待該訊號燈解鎖的執行緒數。

/*semgetvalue.c*/

#include

#include

#include

#include

#include

int main(int argc,char **argv)

sem=sem_open(argv[1],0);

sem_getvalue(sem,&val);

printf(「getvalue:value=%d/n」,val);

exit(0);}

Posix多執行緒程式設計學習筆記(五) 條

一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...

Posix多執行緒程式設計學習筆記(二) 執行緒屬性(3)

六 執行緒的作用域 函式 pthread attr setscope 和pthread attr getscope 分別用來設定和得到執行緒的作用域,這兩個函式的定義如下 7 名稱 pthread attr setscope pthread attr getscope 功能 獲得 設定執行緒的作用域...

Posix多執行緒程式設計學習筆記(二) 執行緒屬性(2)

四 執行緒的排程策略 函式 pthread attr setschedpolicy 和pthread attr getschedpolicy 分別用來設定和得到執行緒的排程策略。4.名稱 pthread attr getschedpolicy pthread attr setschedpolicy ...