程序同步與互斥 POSIX有名訊號量

2021-07-28 16:47:34 字數 4406 閱讀 7065

在 posix 標準中,訊號量分兩種,一種是無名訊號量,一種是有名訊號量。無名訊號量一般用於執行緒間同步或互斥,而有名訊號量一般用於程序間同步或互斥。它們的區別和管道及命名管道的區別類似,無名訊號量則直接儲存在記憶體中,而有名訊號量要求建立乙個檔案。前面我們學習了無名訊號量的使用(詳情請看《無名訊號量》),這裡我們學習有名訊號量的使用。

1)建立乙個有名訊號量

所需標頭檔案:

#include

#include

#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);

功能:

建立乙個有名訊號量。

引數:

name:訊號量檔名。注意,不能指定路徑名。因為有名訊號量,預設放在/dev/shm裡,如下圖:

flags:sem_open() 函式的行為標誌。

mode:檔案許可權(可讀、可寫、可執行)的設定。

value:訊號量初始值。

返回值:

成功:訊號量的位址

失敗:sem_failed

2)關閉有名訊號量所需標頭檔案:

#include

int sem_close(sem_t *sem);功能:

關閉有名訊號量。

引數:

sem:指向訊號量的指標。

返回值:

成功:0

失敗:-1

3)刪除有名訊號量檔案所需標頭檔案:

#include

int sem_unlink(const char *name);功能:

刪除有名訊號量的檔案。

引數:

name:有名訊號量檔名。

返回值:

成功:0

失敗:-1

4)訊號量 pv 操作用法和《posix 無名訊號量》一樣,詳情請點此鏈結。

有名訊號量實現程序間互斥功能:

[cpp]view plain

copy

#include

#include

#include

#include

#include

#include

void

printer(sem_t *sem, 

char

*str)  

printf("\n"

);   

sem_post(sem);  //訊號量加一

}  int

main(

intargc, 

char

*argv)  

else

if(pid == 0)  

char

*str1 = 

"hello"

;  printer(sem, str1); //列印

sem_close(sem); //關閉有名訊號量

_exit(1);  

}else

if(pid > 0)  

char

*str2 = 

"world"

;  printer(sem, str2); //列印

sem_close(sem); //關閉有名訊號量

wait(pid, null); //等待子程序結束

}  sem_unlink("name_sem"

);//刪除有名訊號量

return

0;  

}  

執行結果如下:

有名訊號量實現程序間同步功能(print2 先列印,再到 print1 列印):

print1.c **如下:

[cpp]view plain

copy

#include /* for o_* constants */

#include /* for mode constants */

#include 

#include 

void

print(sem_t *print1, sem_t *print2)  

}  intmain(

intargc, 

char

**argv)  

print2 = sem_open("sem_print2"

, o_creat, 0777, 1);      

if(sem_failed == print2)  

print(print1, print2);  

return

0;  

}  

print2.c **如下:

[cpp]view plain

copy

#include /* for o_* constants */

#include /* for mode constants */

#include 

#include 

void

print(sem_t *print1, sem_t *print2)  

}  intmain(

intargc, 

char

**argv)  

print2 = sem_open("sem_print2"

, o_creat, 0777, 1);    

if(sem_failed == print2)  

print(print1, print2);  

return

0;  

}  

刪除有名訊號量示例**如下:

[cpp]view plain

copy

#include 

#include 

void

sem_del(

char

*name)  

}  intmain(

intargc, 

char

**argv)    

makefile **如下:

[plain]view plain

copy

all:  

gcc sem_del.c -o sem_del -lpthread  

gcc print1.c -o print1 -lpthread  

gcc print2.c -o print2 -lpthread  

clean:  

rm sem_del print1 print2  

執行程式時,先把有名訊號量刪除(sem_del),再分別執行 print1 和 print2:

程序同步與互斥

程序同步與互斥 首先,我們看乙個例子 程序p1 p2公用乙個變數count,初始值為0 p1 p2兩個程序的執行順序是隨機的,p1 p2可能順序執行或交錯執行。由圖可見,不同的執行順序,count值會不同,這是不允許的。在多道程式系統中,由於資源共享或程序合作,使程序間形成間接相互制約和直接相互制約...

程序同步與互斥

為什麼要引入程序同步的概念?多道程式環境下的程序併發執行,它們相互之間存在著不同的制約關係,為了理解和協調這種制約的關係,引入了程序同步的概念。臨界資源是一次只能為乙個程序使用的資源。由於臨界資源的特性,就決定了 對它的訪問必須是互斥的。在每個程序中,訪問臨界資源的那段 稱為臨界區。為了保證臨界資源...

程序 同步與互斥基礎

臨界區 具體一點,在程式中,臨界區就是一段 區域,這段 區在任何時間點至多只有乙個程序在執行它的 打個比方 有個大公尺庫所,裡面裝了若干袋的大公尺,前台有個記錄冊記錄了當前庫所的庫存。當乙個員工運來大公尺時,他首先參看記錄冊中記錄了多少袋大公尺,然後將自己送來的大公尺放入倉庫,最後將自己新加入的大公...