Linux 訊號量同步程式設計

2021-07-10 10:17:45 字數 1254 閱讀 2853

前一篇文章概述了linux 系統中訊號量互斥程式設計,這篇文章正好是前一篇的姊妹篇----訊號量同步。說它們是姊妹篇是因為它們都是利用了核心的訊號量機制實現了程序間的通訊。因為兩者所解決的問題不同,因此它們使用的場景就會有所區別。

訊號量互斥主要解決的問題是:程序間需要同時訪問某種資源,但是它們對資源的操作會互相影響對方的操作結果,因此需要一種機制實現讓程序在訪問資源時能禁止其他程序訪問相同的資源。而訊號量同步則解決了另乙個經典問題:生產者和消費者之間的協同工作問題。

首先描述一下生產者和消費者問題:程序a 負責生產產品(建立並寫入檔案),程序b 負責消費產品(複製檔案),理想的流程是當程序a 建立並寫好資料到檔案以後,程序b就取走檔案。但是兩個程序執行時機的不確定往往讓這個流程出現混亂,即程序a的生產工作還未完成(如只建立了檔案但是沒寫入資料),程序b 就複製了檔案,導致程序b 得到的是乙個不完整的檔案。事實上問題出現的原因就是兩個程序間沒有一種同步的機制。

訊號量的提出就解決了這個問題。訊號量的實現在前一篇文章中有詳細介紹,這裡只是指出運用訊號量同步程序與互斥之間的不同,然後給出乙個例項說明。

下面是筆者實現**的思維導圖:

與互斥不同的是,在給訊號量賦初值時並不是賦值為1,而是賦值為0,並且在生產者中並沒有獲取訊號量,而在消費者中也沒有釋放訊號量。這樣做是為了使兩者的執行次序不會影響最後的結果。

可以分析:如果生產者程式先執行,它會依次建立並寫入檔案,假設此時消費者程式執行,但是此時訊號量初值為0,因此消費者程式被掛起。當生產者程式執行完,釋放訊號量以後,消費者程式繼續執行,最後得到正確的檔案。

如果消費者程式先執行,它測試到訊號量初值是0 ,因此直接被掛起,直到生產者程式執行完才繼續執行,可知這樣也能夠得到正確的檔案。

需要注意的是,在上圖中的1.7 釋放訊號量裡面,包含乙個將初值置為0 的操作,這樣是為了在下一次再執行這兩個程式時,如果先執行消費者,初值仍然是0。

下面是筆者的測試**:

生產者**:

#include #include #include #include #include #include int main(int argc, char **argv)

消費者**;

#include #include #include #include int main(int argc,char **argv)

linux網路程式設計 執行緒同步 訊號量

開發使用多執行緒過程中,不可避免的會出現多個執行緒同時操作同一塊共享資源,當操作全部為讀時,不會出現未知結果,一旦當某個執行緒操作中有寫操作時,就會出現資料不同步的事件.而出現資料混亂的原因 以上三點,前兩點不能被改變.欲提高效率,傳遞資料,資源必須共享.只要資源共享,就一定會出現執行緒間資源競爭,...

同步 訊號量

include stdafx.h include includeusing namespace std int number 1 定義全域性變數 handle hsemaphore 定義訊號量控制代碼 unsigned long stdcall threadproc1 void lp long co...

Linux 執行緒同步 訊號量

linux 執行緒同步訊號量 訊號量用於多執行緒多工同步,乙個執行緒完成了某乙個動作後就通過訊號量告訴其他執行緒再進行某些動作,其他執行緒在等待某乙個執行緒時會阻塞。init sem t sem sem init sem,0,0 函式原型如下 int sem init sem t sem,intps...