此處只涉及利用「二進位制訊號量」(只用0和1)完成「控制線程順序」為中心的同步方法。
訊號量的建立和銷毀函式:
pshared引數超出我們關注的範圍,預設向其傳遞0.
訊號量相當於互斥量lock,unlock的函式:
呼叫sem_init函式時,作業系統將建立訊號量物件,此物件中記錄著「訊號量值」整數。該值在呼叫sem_post函式時增1,呼叫sem_wait函式時減1。訊號量的值不能小於0,當訊號量為0的情況下呼叫sem_wait函式時,呼叫函式的執行緒將進入阻塞狀態。此時如果有其它執行緒呼叫sem_post函式,訊號量的值將變為1,而原來阻塞的執行緒可以將該訊號量重新減為0並跳出阻塞狀態。
實際上就是通過這種特性完成臨界區的同步操作,通過如下形式同步臨界區:
[cpp]
view plain
copy
sem_wait(&sem);
//訊號量變為0...
//臨界區的開始
//.........
//臨界區的結束
sem_post(&sem); //訊號量變為1
上述**中,呼叫sem_wait函式進入臨界區的執行緒在呼叫sem_post函式前不允許其它執行緒進入臨界區。
訊號量的值在0和1之間跳轉,因此,具有這種特性的機制稱為」二進位制訊號量「。
示例:執行緒a從輸入得到值後存入全域性變數num,此時執行緒b將取走該值並累加。該過程共進行5次,完成後輸出總和並退出
[cpp]
view plain
copy
/* 控制訪問順序的執行緒同步 */
#include
#include
#include
void
* read(
void
* arg);
void
* accu(
void
* arg);
static
sem_t sem_one;
static
sem_t sem_two;
static
intnum;
intmain(
intargc,
char
*argv)
void
* read(
void
* arg)
return
null;
} void
* accu(
void
* arg)
printf("result: %d \n"
,sum);
return
null;
} 15,16行生成兩個訊號量。掌握需要2個訊號量的原因。
執行結果:
linux 訊號量(程序間通訊)
將使用乙個程式來演示訊號量的使用,程式用pv操作控制訊號量,以操作臨界區,p操作讓訊號量減1,v操作讓訊號量加1,而pv操作之間的 即為臨界區關鍵 每次只能由乙個程序訪問。程式建立出乙個子程序,在兩個程序中分別有一段臨界區關鍵 實現的功能都是不斷的順序輸出0 9的字元。保證程序間同步 plain v...
linux 程序間通訊 訊號量
例項中首先使用fork 建立乙個子程序,在父程序呼叫kill 之前,在子程序中使用raise 向自身傳送sigstop訊號,是子程序暫停。接下來使用kill 向子程序傳送訊號 ngnsvr9 none home xionghailong example cat kill raise.c includ...
Linux 程序間通訊 訊號量
linux學習目錄 1 什麼是訊號量?在對於臨界區資源管理過程中,為了防止多個程式同時訪問乙個共享資源而引發的一系列問題。比如 死鎖。為了解決這種問題,巨人們就發明了訊號量。訊號量就是為了解決在乙個臨界區只有乙個程序訪問它,也就是說訊號量相當於交警,來協調程序對共享資源有序的訪問而不造成死鎖等行為。...