Linux程序間通訊 訊號量

2021-08-20 19:51:51 字數 1625 閱讀 2947

此處只涉及利用「二進位制訊號量」(只用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 什麼是訊號量?在對於臨界區資源管理過程中,為了防止多個程式同時訪問乙個共享資源而引發的一系列問題。比如 死鎖。為了解決這種問題,巨人們就發明了訊號量。訊號量就是為了解決在乙個臨界區只有乙個程序訪問它,也就是說訊號量相當於交警,來協調程序對共享資源有序的訪問而不造成死鎖等行為。...