1. 程式人生 > >多執行緒訊號量,互斥鎖,條件變數異同

多執行緒訊號量,互斥鎖,條件變數異同

條件變數類似於訊號量,一旦條件“成熟”則進行處理,條件變數能使執行緒處於wait狀態,另一個執行緒在滿足條件的時候發signal,然後所有處於wait的執行緒依次得到喚醒,條件變數通過執行緒阻塞和可以給另一個執行緒傳送signal喚醒執行緒的優厚條件彌補了互斥鎖只有加鎖和解鎖的這兩種情況,在一般情況下,條件變數和互斥鎖是聯合使用的,在條件成熟的情況下,加鎖,處理資料,釋放鎖,再次等待條件成熟。它是傳送訊號與等待訊號。互斥鎖使用者上鎖,條件變數則用於等待。一般來說,在一個程序/執行緒中呼叫pthread_cond_wait(..)等待某個條件的成立,此時該程序阻塞在這裡,另外一個程序/執行緒進行某種操作,當某種條件成立時,呼叫pthread_cond_signal(...)來發送訊號,從而使pthread_cond_wait(...)返回。此處要注意的是,這裡所談到的訊號,不是系統級別的SIGXXXX訊號,只是用訊號這個詞語更容易理解。條件變數與訊號量更接近或者就可以認為是訊號量。pthread_cond_wait函式也可以用一個while死迴圈來等待條件的成立,但要注意的是,使用while死迴圈會嚴重消耗CPU,而pthread_cond_wait則是採用執行緒睡眠的方式,它是一種等待模式,而不是一直的檢查模式。每個訊號量有一個與之關聯的值,掛出時+1,等待時-1,那麼任何執行緒都可以掛出一個訊號,即使沒有執行緒在等待該訊號量的值。不過對於條件變數來說,如果pthread_cond_signal之後沒有任何執行緒阻塞在pthread_cond_wait上,那麼此條件變數上的訊號丟失。

相關推薦

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

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

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

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

執行訊號互斥條件變數異同

條件變數類似於訊號量,一旦條件“成熟”則進行處理,條件變數能使執行緒處於wait狀態,另一個執行緒在滿足條件的時候發signal,然後所有處於wait的執行緒依次得到喚醒,條件變數通過執行緒阻塞和可以給另一個執行緒傳送signal喚醒執行緒的優厚條件彌補了互斥鎖只有加鎖和解鎖的這兩種情況,在一般情況下,條件變

Java執行-53-ReentrantLock類-互斥

前面文章末尾,我們提到wait會釋放鎖,而sleep不會釋放鎖。那麼什麼是鎖,鎖就是把執行緒鎖住。也就是執行緒能被鎖住,當然還有釋放鎖。這篇來了解下ReentrantLock類,中文的意思就是互斥鎖。主要學習這個類的lock()獲取鎖和unlock()釋放鎖。 互斥鎖程式碼舉例 我們先來

Java執行中的物件互斥

1、為什麼會有鎖? 在看執行緒同步的問題之前,我們先看一個生活中的小例子: 我拿著銀行卡去ATM取錢,假如我的卡里有3000塊,我要取走2000,這個時候,ATM會去銀行的資料庫裡查詢我的賬戶是否有2000以上的餘額,如果有,就會讓我取走,不幸的是,這個時候

python執行程式設計(3): 使用互斥同步執行

問題的提出 上一節的例子中,每個執行緒互相獨立,相互之間沒有任何關係。現在假設這樣一個例子:有一個全域性的計數num,每個執行緒獲取這個全域性的計數,根據num進行一些處理,然後將num加1。很容易寫出這樣的程式碼: # encoding: UTF-8import

守護進執行互斥訊號佇列遞迴

守護程序: from multiprocessing import Process import os,time,random def task(): print('%s is running' %os.getpid()) time.sleep(2)

程序間通訊機制(管道、訊號、共享記憶體/訊號/訊息佇列)、執行間通訊機制(互斥條件變數、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

進程(了解)守護進程互斥信號進程Queue與線程queue

生產 模塊 多進程 異常 參數 進程池 數據 div ssi 一、守護進程   主進程創建守護進程,守護進程的主要的特征為:①守護進程會在主進程代碼執行結束時立即終止;②守護進程內無法繼續再開子進程,否則會拋出異常。 實例: from multiprocessing im

Java之執行安全(屌絲版兩大解決思路要麼不去競爭(開闢執行副本)、要麼有順序的競爭資源(用規定執行秩序))

0、多執行緒安全,如果多個執行緒操作一個變數,每次都能達到預期的結果,那麼說明當前這個類起碼是執行緒安全的,我這白話的,可能有點噁心。   1、看看牛人是怎麼說的,為什麼多執行緒併發是不安全的? 在作業系統中,執行緒是不再擁有資源的,程序是擁有資源的。而執行緒是由程序建立的

C++執行-第二篇-Mutex(互斥)

//Boost#include<boost/thread/thread.hpp>#define BOOST_THREAD_VERSION 4 //使用最新版本,含有1,2,3但只是為了相容之前程式。 Thread庫豐富強大的擴充套件功能但不在Thre

JAVA基礎23-執行(三)【synchronizedReentranLockvolatile、死

一、同步         大多數多執行緒應用中,兩個或兩個以上的執行緒需要共享對同一資料的存取,此時出現多個程式交替處理該資料,從而導致資料出現訛誤。 9-1.Synchronized關鍵字       &nb

理解執行(三)--互斥

std::mutex mutex就是互斥量的意思,在c++中使用互斥量需要包含#include 引入互斥量 之前瞭解了執行緒訪問公有資料是不安全的,所以使用互斥量來防治執行緒不安全的操作。 互斥量就是一個變數,只有兩種狀態,加鎖和解鎖。每一個互斥量管理一個公有資料,一個執行緒訪問

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

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

C++執行同步之Mutex(互斥)

一、互斥量Mutex同步多執行緒 1、Win32平臺 相關函式和標頭檔案 #include <windows.h> HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes

windows下執行同步(利用事件物件互斥物件關鍵程式碼段)實現

一:利用事件實現執行緒同步 1.createthread函式的用法 hThread = CreateThread(&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThre

程序間通訊:佇列管道檔案共享記憶體訊號事件互斥socket

2017/11/4 程序間通訊,程序池 程序間通訊(IPC,inter-process communication):生產程序生產食物,消費程序購買食物,消費程序一直監視生產狀況,只要一有食物就將其取出來,如果取到食物None,兩者關係結束,於是主程序也結束。 遠端過程呼叫

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

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

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

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