#include
#include
#include
#include
#include
#include
using
namespace std;
const
int times =5;
const
int delay =5;
union semaphore
;static
int semaphoreid =0;
static
bool
initializesemaphorevalue()
static
bool
semaphorep()
static
bool
semaphorev()
static
void
deletesemaphoreset()
}int
main
(int argc,
char
const
*ar**)
if(!initializesemaphorevalue()
) pid_t pid =
fork()
; string message;
switch
(pid)
srand((
unsigned
)getpid()
);for(
int i =
0; i < times; i++
) cout << message
(stdout);
sleep
(rand()
% delay);if
(!semaphorev()
)}if(pid >0)
printf
("pid %d finished!\n"
,getpid()
);return0;
}
系統呼叫semctl()的第乙個引數是訊號量集ipc識別符號。第二個引數是操作訊號在訊號集中的編號,第乙個訊號的編號是0根據引數cmd選擇功能
引數arg代表乙個semun的例項。semun是在linux/sem.h中定義的:
/arg for semctl systemcalls./
union semun;
這三個欄位的意義分別為:
sem_num:操作訊號在訊號集中的編號,第乙個訊號的編號是0。
sem_op:如果其值為正數,該值會加到現有的訊號內含值中。通常用於釋放所控資源的使用權;如果sem_op的值為負數,而其絕對值又大於訊號的現值,操作將會阻塞,直到訊號值大於或等於sem_op的絕對值。通常用於獲取資源的使用權;如果sem_op的值為0,如果沒有設定ipc_nowait,則呼叫該操作的程序或者執行緒將暫時睡眠,直到訊號量的值為0;否則,程序或者執行緒不會睡眠,函式返回錯誤eagain。
sem_***:訊號操作標誌,可能的選擇有兩種
ipc_nowait //對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊。
sem_undo //程式結束時(不論正常或不正常),保證訊號值會被重設為semop()呼叫前的值。這樣做的目的在於避免程式在異常情況下結束時未將鎖定的資源解鎖,造成該資源永遠鎖定。
nsops:訊號操作結構的數量,恆大於或等於1。
timeout:當semtimedop()呼叫致使程序進入睡眠時,睡眠時間不能超過本引數指定的值。如果睡眠超時,semtimedop()將失敗返回,並設定錯誤值為eagain。如果本引數的值為null,semtimedop()將永遠睡眠等待。
操作乙個或一組訊號
key:所建立或開啟訊號量集的鍵值。nsems:建立的訊號量集中的訊號量的個數,該引數只在建立訊號量集時有效。
sem***:呼叫函式的操作型別,也可用於設定訊號量集的訪問許可權,兩者通過or表示
若成功,則返回訊號量集的ipc識別符號,否則返回-1
建立訊號量集
parent
child
parent
child
parent
child
parent
child
parent
child
pid 15250 finished!
pid 15249 finished!
若注釋掉main函式中的semaphorev()函式和semaphorep()函式,則會不能保證輸出結果的正確,由於父程序和子程序相互競爭輸出結果,導致輸出序列的混亂,訊號量機制保證父程序和子程序交替進行,得到想要的結果
parent
child
parent
parent
parent
parent
child
child
child
child
pid 19265 finished!
pid 19264 finished!
訊號量控制併發數
建立乙個訊號量,設定最大併發數為5,5個執行緒,非同步執行 dispatch semaphore tsema dispatch semaphore create 5 dispatch semaphore wait sema,dispatch time forever dispatch async d...
0716Semaphore 訊號量控制程序同步
from multiprocessing import process current process semaphore def funca args args 引數是例項化的semaphoer 開啟乙個檔案,寫入內容,在本函式執行的時候其他程序不能執行 semaphoer例項的acquire 方...
Linux 實現用訊號量控制多執行緒操作例項
1.有三個執行緒執行以下的程式,執行緒1負責輸入10個整數,判斷整數的奇偶性,如果是偶數執行緒2輸出,如果是奇數執行緒3輸出,執行緒2和執行緒3最後統計輸出偶數和奇數的總數。用訊號量機制實現這三個執行緒的同步與互斥活動,並執行緒來實現。首先建立出3個執行緒,因為執行緒1必須等執行緒2或執行緒3輸出乙...