1. 程式人生 > >Linux程序通訊[2]-互斥鎖和條件變數

Linux程序通訊[2]-互斥鎖和條件變數

概述

上一篇介紹了共享記憶體,已經屬於比較高階的層次。本篇介紹一下多執行緒/多程序最基礎的問題,同步。
為了允許線上程或程序間共享資料,同步常常是必需的,也就是我們常說要用鎖(當然鎖通常也是效能瓶頸,現在無鎖架構正在越發流行)。互斥鎖和條件變數則是同步的基本組成部分。互斥鎖和條件變數在同一程序下的所有執行緒內是共享的,所有它天然可以用於執行緒同步。如果將互斥鎖和條件變數存放在多個程序的共享區內,則同樣可以用於程序間同步。(Posix標準)

互斥鎖

互斥鎖用於保護臨界區(critical section),保證在任何時刻只有一個執行緒/程序在執行其中的程式碼。保護一個臨界區的程式碼通常輪廓如下:

1 lock_the_mutex(...);
2 //do anything one by one
3 unlock_the_mutex(...);

在實際程式碼中,我們通常使用如下的資料機構和函式。

01 #include <pthread.h>
02 //pthread_mutex_t 是鎖的定義
03 static
 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZE;
04
05 //嘗試對ptr上鎖,否則一直阻塞
06 int pthread_mutex_lock(pthread_mutex_t *ptr);
07 //嘗試對ptr上鎖,失敗則直接返回
08 int pthread_mutex_trylock(pthread_mutex_t *ptr);
09 //解鎖
10 int pthread_mutex_unlock(pthread_mutex_t *ptr);

條件變數

條件變數(condition)不同於互斥鎖,它主要用於等待。因為我們線上程/程序同步時,通常都需要等待其他執行緒/程序完成任務再繼續自己的任務。這時,僅僅使用mutex就無法完美的解決這個問題。假設我們只使用mutex,則需要鎖上一個mutex然後查詢,如果沒有前序任務則解鎖,然後隔斷時間再繼續上述過程。而藉助條件變數,我們則可以大大簡化這個過程。在鎖上mutex後,如果沒有前序任務則呼叫wait函式,系統會自動釋放mutex並且等待前置訊號的到達,且訊號到達後還是擁有mutex。
下面是condition的常用函式:

1 #include <pthread.h>
2

相關推薦

Linux程序通訊[2]-互斥條件變數

概述 上一篇介紹了共享記憶體,已經屬於比較高階的層次。本篇介紹一下多執行緒/多程序最基礎的問題,同步。 為了允許線上程或程序間共享資料,同步常常是必需的,也就是我們常說要用鎖(當然鎖通常也是效能瓶頸,現在無鎖架構正在越發流行)。互斥鎖和條件變數則是同步的基本組成部分。互斥鎖和條件變數在同一程序下的所有

linux下用互斥條件變數來實現讀寫

以下內容來源自UNP卷二的第八章 讀寫鎖的概念( the conception of read-write lock ) (1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該執行緒用於讀 (2)僅當沒有執行緒持有某個給定的讀寫鎖用於讀或用於寫,才能分配該

Linux使用互斥條件變數實現讀寫(寫優先)

(1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀(2)僅當沒有執行緒持有某個讀寫鎖用於讀或用於寫時,才能分配該讀寫鎖用於寫換一種說法就是,只要沒有執行緒在修改(寫)某個給定的資料,那麼任意數目的執行緒都可以擁有該資料的訪問權(讀)。僅

Linux C互斥條件變數(POSIX標準)

       與程序類似,執行緒也存在同步的問題,當多個控制執行緒共享相同的記憶體時,需要確保每個執行緒看到一致的資料檢視,如果每個執行緒使用的變數都是其他執行緒不會讀取或修改的(比如執行緒私有資料),就不會存在一致性問題。通常來說使用者可以使用互斥量(互斥鎖)或者的條件變數

Linux多執行緒消費者生產者模型例項(互斥條件變數使用)

條件變數簡單介紹: 條件變數是執行緒可以使用的另一種同步機制。條件變數與互斥量一起使用的時候,允許執行緒以無競爭的方式等待特定的條件發生。條件本身是由互斥量保護的。執行緒在改變條件變數狀態前必須先鎖住互斥量。另一種是動態分配的條件變數,則用pthread_cond_ini

Linux下多執行緒程式設計互斥條件變數的簡單使用

Linux下的多執行緒遵循POSIX執行緒介面,稱為pthread。編寫Linux下的多執行緒程式,需要使用標頭檔案pthread.h,連結時需要使用庫libpthread.a。執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位。執行緒

通過互斥條件變數實現佇列的無sleep生產與消費

昨天轉了一篇文章將條件變數與互斥鎖的結合使用,今天給大家摳出曾經學到的一段高效的處理訊息的demo,通過互斥鎖實現安全佇列,通過條件變數實現佇列的工作與休息。 目錄結構: 簡單介紹: SignalThread是封裝好的執行緒類,我們所做的核心工作都是在這裡完成,其他類也是服務於這裡;

執行緒私有資料TSD——一鍵多值技術,執行緒同步中的互斥條件變數

一:執行緒私有資料: 執行緒是輕量級程序,程序在fork()之後,子程序不繼承父程序的鎖和警告,別的基本上都會繼承,而vfork()與fork()不同的地方在於vfork()之後的程序會共享父程序的地址空間,但是有了寫實複製(fork()之後的子程序也不會直接

多執行緒用互斥條件變數實現生產者消費者-------迴圈任務佇列

互斥鎖與條件變數簡介 在多執行緒的環境中,全域性變數會被各執行緒共享,因此在操作全域性變數的時候需要採用鎖機制,在linux裡最常用的鎖就是互斥鎖,互斥鎖使用方法如下 <pre name="code" class="cpp">//執行緒A pthread_mut

C++ 併發程式設計之互斥條件變數的效能比較

介紹 本文以最簡單生產者消費者模型,通過執行程式,觀察該程序的cpu使用率,來對比使用互斥鎖 和 互斥鎖+條件變數的效能比較。 本例子的生產者消費者模型,1個生產者,5個消費者。 生產者執行緒往佇列裡放入資料,5個消費者執行緒從佇列取資料,取資料前需要判斷一下佇列中是否有資料,這個佇列是全域性佇列,是執行緒間

Linux多執行緒學習(2)--執行緒的同步與互斥及死問題(互斥條件變數)

Linux多執行緒學習總結 一.互斥量 1.名詞理解 2.什麼是互斥量(mutex) 3.互斥量的介面 3.1 初始化訊號量 3.2 銷燬訊號量 3.3 互斥量加鎖和解鎖

Linux多執行緒程式設計---執行緒間同步(互斥條件變數、訊號量讀寫

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導

程序通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥條件變數、posix匿名訊號量)

(1)系統中每個訊號量的資料結構(sem)struct sem {     int semval; /* 訊號量的當前值 */     unsigned short  semzcnt;  /* # waiting for zero */     unsigned short  semncnt;  /* # w

linux執行緒間同步(通訊)的幾種方法——互斥條件變數、訊號量、讀寫

Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導圖:  一、互斥鎖(mutex)    鎖機制是同一時刻只允許一個執行緒執行一個關鍵部分的程式碼。 1 . 初始化鎖 int pthread_mutex_init(p

linux c 執行緒間同步(通訊)的幾種方法--互斥條件變數,訊號量,讀寫

轉載自:https://blog.csdn.net/vertor11/article/details/55657619Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。 下面是思維導圖: 一、互斥鎖(mutex)   鎖機制是同一時刻只允

互斥條件變量(pthread)相關函數

code 數據類型 wait 模式 truct color tro val initial 互斥鎖 #include <pthread.h> // 若成功返回0,出錯返回正的Exxx值 // mptr通常被初始化為PTHREAD_MUTEX_INITIALI

訊號量、互斥、讀寫條件變數之間的區別

訊號量 強調的是執行緒(或程序)間的同步:“訊號量用在多執行緒多工同步的,一個執行緒完成了某一個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作(大家都在sem_wait的時候,就阻塞在那裡)。當訊號量為單值訊號量是,也可以完成一個資源的互斥訪問。 有名

Linux C 多執行緒程式設計】互斥條件變數

一、互斥鎖互斥量從本質上說就是一把鎖, 提供對共享資源的保護訪問。  1. 初始化:  在Linux下, 執行緒的互斥量資料型別是pthread_mutex_t. 在使用前, 要對它進行初始化:  對於靜態分配的互斥量, 可以把它設定為PTHREAD_MUTEX_INITIA

Linux】執行緒總結:執行緒同步 -互斥條件變數,訊號量實現多生產者多消費者模型

學習環境 :  Centos6.5 Linux 核心 2.6 Linux執行緒部分總結分為兩部分:(1)執行緒的使用 ,(2)執行緒的同步與互斥。 第一部分執行緒的使用主要介紹,執行緒的概念,建立執行緒,執行緒退出,以及執行緒的終止與分離。【完

執行緒、互斥條件變數例項理解

互斥鎖: 初始化程序鎖: int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); 其中 mutex 為鎖號 attr為屬性 摧毀互