訊號量(semaphore)是一種用於提供不同程序之間或者乙個給定的不同執行緒間同步手段的原語。訊號量多用於程序間的同步與互斥,簡單的說一下同步和互斥的意思:
同步:處理競爭就是同步,安排程序執行的先後順序就是同步,每個程序都有一定的先後執行順序。
互斥:互斥訪問不可共享的臨界資源,同時會引發兩個新的控制問題(互斥可以說是特殊的同步)。
競爭:當併發程序競爭使用同乙個資源的時候,我們就稱為競爭程序。
共享資源通常分為兩類:一類是互斥共享資源,即任一時刻只允許乙個程序訪問該資源;另一類是同步共享資源,即同一時刻允許多個程序訪問該資源;訊號量是解決互斥共享資源的同步問題而引入的機制。
簡單說一下訊號量的工作機制(因為真的很簡單),可以直接理解成計數器(當然其實加鎖的時候肯定不能這麼簡單,不只只是訊號量了),訊號量會有初值(>0),每當有程序申請使用訊號量,通過乙個p操作來對訊號量進行-1操作,當計數器減到0的時候就說明沒有資源了,其他程序要想訪問就必須等待(具體怎麼等還有說法,比如忙等待或者睡眠),當該程序執行完這段工作(我們稱之為臨界區)之後,就會執行v操作來對訊號量進行+1操作。
臨界區:臨界區指的是乙個訪問共用資源(例如:共用裝置或是共用儲存器)的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。
臨界資源:只能被乙個程序同時使用(不可以多個程序共享),要用到互斥。
我們可以說訊號量也是程序間通訊的一種方式,比如互斥鎖的簡單實現就是訊號量,乙個程序使用互斥鎖,並通知(通訊)其他想要該互斥鎖的程序,阻止他們的訪問和使用。
當有程序要求使用共享資源時,需要執行以下操作:
1.系統首先要檢測該資源的訊號量;
2.若該資源的訊號量值大於0,則程序可以使用該資源,此時,程序將該資源的訊號量值減1;
3.若該資源的訊號量值為0,則程序進入休眠狀態,直到訊號量值大於0時程序被喚醒,訪問該資源;
當程序不再使用由乙個訊號量控制的共享資源時,該訊號量值增加1,如果此時有程序處於休眠狀態等待此訊號量,則該程序會被喚醒。
每個訊號量集都有乙個與其相對應的結構,該結構定義如下:
/* data structure describing a set of semaphores. */
struct semid_ds
;
/* data structure describing each of semaphores. */
struct sem
;
訊號量集的結構圖如下所示:
使用訊號量實現生產者消費者模式
#include "stdafx.h"
#include #include #include #include #include #include #include #include #includeusing namespace std;
#pragma comment(lib,"pthreadvc2.lib")
#define n 5 //消費者或者生產者的數目
#define m 10 //緩衝數目
int productin = 0; //生產者放置產品的位置
int prochaseout = 0; //消費者取產品的位置
int buff[m] = ; //緩衝區初始化為0,開始時沒有產品。
sem_t empty_sem; // 同步訊號量,當滿的時候阻止生產者放產品。
sem_t full_sem; //同步訊號量,當沒有產品的時候阻止消費者消費。
pthread_mutex_t mutex; //互斥訊號量,一次只有乙個執行緒訪問緩衝區。
int product_id = 0; //生產者id
int prochase_id = 0; //消費者id
void signalexit(int signo)
void printproduction()
printf("\n\n");
}//生產者方法
void* product(void* pramter)
}//消費者方法///
void* prochase( void* pramter )
}int main()
//初始化互斥訊號量
int mutexinit = pthread_mutex_init(&mutex,null);
if( mutexinit != 0 )
//建立n個生產者執行緒
for(int i = 0; i < n; i++ )
}//建立n個消費者執行緒
for(int j = 0; j < n; j++ )
}///等待執行緒被銷毀///
for( int k = 0; k < n; k++ )
return 0;
}
程序間通訊方式 訊號量(Semaphore)
include include includeint semget key t key,int nsems,int flags 返回 成功返回訊號集id,出錯返回 1 int semctl int semid,int semnum,int cmd,union semun int semop int ...
IPC 程序間通訊方式 訊號量
includestruct semid ds include int semget key t key,int nsems,int flag 返回 如果成功,返回訊號量集id,出錯返回 1 若建立訊息佇列,key可以指定鍵值,也可以設定為ipc private 0 若開啟進行查詢,則key不能為0,...
Linux 程序間通訊(四)訊號量
訊號量和其他ipc不同,並沒有在程序之間傳送資料,訊號量用於多程序在訪問共享資源時的同步控制就像交通路口的紅路燈一樣,當訊號量大於0,表示綠燈允許通過,當訊號量等於0,表示紅燈,必須停下來等待綠燈才能通過。程序間的互斥關係與同步關係存在的根源在於臨界資源。臨界資源是在同乙個時刻只允許有限個 通常只有...