在 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:訊號量初始值。
成功:訊號量的位址2)關閉有名訊號量所需標頭檔案:失敗:sem_failed
#includeint sem_close(sem_t *sem);功能:
關閉有名訊號量。引數:
sem:指向訊號量的指標。返回值:
成功:03)刪除有名訊號量檔案所需標頭檔案:失敗:-1
#includeint sem_unlink(const char *name);功能:
刪除有名訊號量的檔案。引數:
name:有名訊號量檔名。返回值:
成功:04)訊號量 pv 操作用法和《posix 無名訊號量》一樣,詳情請點此鏈結。失敗:-1
有名訊號量實現程序間互斥功能:
[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值會不同,這是不允許的。在多道程式系統中,由於資源共享或程序合作,使程序間形成間接相互制約和直接相互制約...
程序同步與互斥
為什麼要引入程序同步的概念?多道程式環境下的程序併發執行,它們相互之間存在著不同的制約關係,為了理解和協調這種制約的關係,引入了程序同步的概念。臨界資源是一次只能為乙個程序使用的資源。由於臨界資源的特性,就決定了 對它的訪問必須是互斥的。在每個程序中,訪問臨界資源的那段 稱為臨界區。為了保證臨界資源...
程序 同步與互斥基礎
臨界區 具體一點,在程式中,臨界區就是一段 區域,這段 區在任何時間點至多只有乙個程序在執行它的 打個比方 有個大公尺庫所,裡面裝了若干袋的大公尺,前台有個記錄冊記錄了當前庫所的庫存。當乙個員工運來大公尺時,他首先參看記錄冊中記錄了多少袋大公尺,然後將自己送來的大公尺放入倉庫,最後將自己新加入的大公...