程序間通訊之 訊號量

2022-03-28 02:38:01 字數 2676 閱讀 4708

程序間通訊簡單的說有三個問題,第乙個問題是:乙個程序如何把資訊傳遞給另乙個,第二個問題是:要確保兩個或者更多的程序在互動中不會出現交叉(即是程序互斥問題),第三個問題是:程序間同步問題、

四種程序或者執行緒同步互斥的控制方法

1):臨界區:通過對多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問。

2):互斥量:為協調共同對乙個共享資源的單獨訪問而設計的

3):訊號量:為控制乙個具有有限數量使用者資源而設計

4):事件:用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。

臨界區(critical section)

保證在某一時刻只有乙個執行緒能訪問資料的簡便辦法,在任意時刻只允許乙個執行緒對共享資源進行訪問,如果有多個執行緒試圖同時訪問臨界區,那麼在有乙個執行緒進入後其他試圖訪問此臨界區的執行緒將被掛起,並一直持續到進入臨界區的執行緒離開,臨界區在被釋放後,其他執行緒可以繼續搶占,並以此達到原子方式操作共享資源的目的。

臨界區包含兩個操作原語:

之後會在安裝目錄看到有三個資料夾pre-built.2、pthreads.2、queueuserapcex.

將pre-built.2資料夾下的include和lib資料夾裡的檔案複製到vs對應的include和lib目錄,我這裡是c:\program files\microsoft visual studio 11.0\vc\include和c:\program files\microsoft visualstudio 11.0\vc\lib.這樣就可以了,如果執行的時候鏈結錯誤,把pthreadvc2.dll 拷貝到你程式的可執行目錄下試試。

1 #include "

stdafx.h

"2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10

11 #include12

using

namespace

std;

13#pragma comment(lib,"pthreadvc2.lib")

1415

#define n 5 //

消費者或者生產者的數目

16#define m 10 //

緩衝數目

1718

int productin = 0; //

生產者放置產品的位置

19int prochaseout = 0; //

消費者取產品的位置

2021

int buff[m] = ; //

緩衝區初始化為0,開始時沒有產品。

2223 sem_t empty_sem; //

同步訊號量,當滿的時候阻止生產者放產品。

24 sem_t full_sem; //

同步訊號量,當沒有產品的時候阻止消費者消費。

2526 pthread_mutex_t mutex; //

互斥訊號量,一次只有乙個執行緒訪問緩衝區。

2728

int product_id = 0; //

生產者id

29int prochase_id = 0; //

消費者id

3031

void signalexit(int

signo)

3236

37void

printproduction()

3844 printf("

\n\n");

45}4647

/////////////////////

/生產者方法

//////////////////

//48

void* product(void*pramter)

4965}66

67////////////

//消費者方法

/////////////////////

//68

void* prochase( void*pramter )

6986}87

88int

main()

89104

105//

初始化互斥訊號量

106int mutexinit = pthread_mutex_init(&mutex,null);

107if( mutexinit != 0

)108

112113

//建立n個生產者執行緒

114for(int i = 0; i < n; i++)

115122

}123

124//

建立n個消費者執行緒

125for(int j = 0; j < n; j++)

126133

}134

135/////////////////////

//等待執行緒被銷毀

/////////////////////////////////////////////

//136

for( int k = 0; k < n; k++)

137142

return0;

143 }

程序間通訊之訊號量

訊號量的本質是一種資料操作鎖,其本身不具有資料交換的能力,而是通過控制其他的通訊資源 檔案 外部裝置 來實現程序間通訊,它本身只是一種外部資源的標識。訊號量在此過程中負責資料的互斥 同步等功能。當請求乙個訊號量來表示資源時,程序需要讀取訊號量的值來判斷資源是否可用。大於0,資源可以請求,等於0,無資...

程序間通訊之訊號量

訊號量的本質是一種資料操控鎖,它本身不具有資料交換的功能,而是通過來控制其他的通訊資源來實現程序間通訊的,訊號主要負責資料的同步與互斥功能。程序請求乙個使用訊號量來表示的資源時,首先要讀取訊號量的值來判斷資源是否能被使用,若訊號量的值大於0,資源可用,等於0,無資源可用,同時程序會進入睡眠狀態,直到...

程序間通訊之 訊號量

訊號量相當於記錄資源能同時被多少個程序訪問。訊號量的作用 程序間同步控制。訊號量有乙個初值,每當有程序申請使用訊號量,就會通過乙個p操作對訊號量進行 1操作,當計數器減到0的時候就說明沒有資源了,其他程序要想訪問就必須等待,當該程序執行完這段工作之後,就會執行v操作,即對訊號量進行 1操作。標頭檔案...