1. 程式人生 > >Linux執行緒同步機制的幾種方法總結與對比

Linux執行緒同步機制的幾種方法總結與對比

執行緒同步機制的幾種方法總結與對比

需要執行緒同步的原因:

當有多個執行緒同時訪問一個共享記憶體裡面的變數時,有時會出現一個執行緒正在修改該變數的值,而其他的執行緒正在讀取資料,可能就會導致錯誤。

實現執行緒同步機制的方法:

·互斥量

·讀寫鎖

·條件變數

一. 互斥量

互斥量從本質上說就是一把鎖,在訪問共享資源時,對互斥量加鎖,訪問完成後釋放鎖。對互斥量加鎖以後,其他任何試圖對互斥量再次加鎖的執行緒會被阻塞直至當前執行緒釋放互斥鎖。

相關函式可參考 APUE 教材。

二. 避免死鎖

如果某個執行緒試圖對同一個互斥量加鎖兩次,那麼它將進入死鎖狀態,這個是比較明顯的死鎖產生狀態。還有一些更加不明顯的方式也能產生死鎖。比如:程式使用多個互斥量時,如果允許 執行緒甲 一直佔有第一個互斥量 A 並且在試圖鎖住第二個互斥量 B 時處於阻塞狀態,但是擁有第二個互斥量 B 的執行緒 乙 也在試圖鎖住第一個互斥量 A 

這時就會發生死鎖。

解決方法:可用過小心的控制互斥量加鎖順序來避免死鎖。

運用資料結構解決。

三. 讀寫鎖

讀寫鎖和互斥量類似,區別在於:互斥量只有兩個狀態,即鎖住狀態和不加鎖狀態,而且一次只有一個執行緒可以對其加鎖。而讀寫鎖可以有三個狀態,讀模式下加鎖狀態,寫模式下加鎖狀態,不加鎖狀態。一次只能有一個執行緒佔有寫模式的讀寫鎖,但可以由多個執行緒同時佔有讀模式的讀寫鎖。

讀寫鎖非常適用於對資料結構讀次數遠大於寫的情況。

相關函式可參考 APUE 教材。

四. 條件變數

條件變數使我們可以睡眠等待某種條件出現。

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待"

條件變數的條件成立"而掛起;另一個執行緒使"條件成立"(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和一個互斥鎖結合在一起。

相關函式可參考 APUE 教材。

相關推薦

Linux執行同步機制方法總結對比

執行緒同步機制的幾種方法總結與對比 需要執行緒同步的原因: 當有多個執行緒同時訪問一個共享記憶體裡面的變數時,有時會出現一個執行緒正在修改該變數的值,而其他的執行緒正在讀取資料,可能就會導致錯誤。

Linux執行同步方法

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

歸納一下:C#執行同步方法

 我們在程式設計的時候,有時會使用多執行緒來解決問題,比如你的程式需要在後臺處理一大堆資料,但還要使使用者介面處於可操作狀態;或者你的程式需要訪問一些外部資源如資料庫或網路檔案等。這些情況你都可以建立一個子執行緒去處理,然而,多執行緒不可避免地會帶來一個問題,就是執行緒同步的問題。如果這個問題處理不好,我們就

java中執行同步方法

方法一: 使用synchronized關鍵字  由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會

關於執行同步方法

0賬戶餘額為:11 1賬戶餘額為:12 2賬戶餘額為:13 3賬戶餘額為:14 4賬戶餘額為:15 5賬戶餘額為:16 6賬戶餘額為:17 7賬戶餘額為:18 8賬戶餘額為:19 9賬戶餘額為:20 10賬戶餘額為:21 11賬戶餘額為:22 12賬戶餘額為:23 13賬戶餘額為:24 14賬戶餘額為:25

執行同步方法總結

執行緒同步的方式包括:互斥鎖、讀寫鎖、條件變數、訊號量和令牌。 互斥鎖和讀寫鎖:提供對臨界資源的保護,當多執行緒試圖訪問臨界資源時,都必須通過獲取鎖的方式來訪問臨界資源。(臨界資源:是被多執行緒共享的資源)當讀寫執行緒獲取鎖的頻率差別不大時,一般採用互斥鎖,如果讀執行緒訪

【多執行】實現執行同步方法(一)

前言 最近小扁我被問到 實現執行緒同步有哪幾種方法,而我只知道使用同步關鍵字synchronized來實現而已(⊙o⊙),,所以有必要來學習一下實現執行緒同步的幾種方法;各位看官,若有非議(不接受反駁),請不吝賜教! 實現執行緒同步的幾種方法 從我自己

實現執行同步方法

在多執行緒程式中,會出現多個執行緒搶佔一個資源的情況,這時間有可能會造成衝突,也就是一個執行緒可能還沒來得及將更改的 資源儲存,另一個執行緒的更改就開始了。可能造成資料不一致。因此引入多執行緒同步,也就是說多個執行緒只能一個對共享的資源進行更改,其他執行緒不能

C#多執行同步方法

9.ReaderWriterLockSlim 類 讀寫鎖的概念很簡單,允許多個執行緒同時獲取讀鎖,但同一時間只允許一個執行緒獲得寫鎖,因此也稱作共享-獨佔鎖。在C#中,推薦使用ReaderWriterLockSlim類來完成讀寫鎖的功能。某些場合下,對一個物件的讀取次數遠遠大於修改次數,如果只是簡單的用lo

C#執行同步方法

Code public void Function() {object lockThis = new object (); lock (lockThis){// Access thread-sensitive resources. }}

Linux 執行同步的三方法

序 執行緒的最大特點是資源的共享性,但資源共享中的同步問題是多執行緒程式設計的難點。linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數和訊號量。 一、互斥鎖(mutex) 通過鎖機制實現執行緒間的同步。 初始化鎖。在Linux下,執行緒的互斥量資料型別

實現執行同步方式總結

在多執行緒中執行緒的執行順序是依靠哪個執行緒先獲得到CUP的執行權誰就先執行,雖然說可以通過執行緒的優先權進行設定,但是他只是獲取CUP執行權的概率高點,但是也不一定必須先執行。在這種情況下如何保證執行緒按照一定的順序進行執行,今天就來一個大總結,分別介紹一下幾種方式。 通

Linux執行同步常見方法

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

Linux多程序和執行同步方式

   引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496 linux下程序間通訊的幾種主要手段簡介:    1. 管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的

執行同步實現方法

一、引言 前幾天面試,被大師虐殘了,好多基礎知識必須得重新拿起來啊。閒話不多說,進入正題。 二、為什麼要執行緒同步 因為當我們有多個執行緒要同時訪問一個變數或物件時,如果這些執行緒中既有讀又有寫操作時,就會導致變數值或物件的狀態出現混亂,從而導致程式

【ARM&Linux】常用執行同步的三方法

【執行緒同步高效率程式設計】 Linux系統中執行緒最大的特點就是共享性,執行緒同步問題較為困難也很重要,最常用的三種是:條件變數、互斥鎖、無名訊號量。(ps: 有名訊號量可用於程序同步,無名訊

Linux下線程同步方法

間接 dset %d 情況 就是 roc spa new ans Linux下提供了多種方式來處理線程同步,最常用的是互斥鎖、條件變量和信號量。一、互斥鎖(mutex)   鎖機制是同一時刻只允許一個線程執行一個關鍵部分的代碼。 1. 初始化鎖   int pthread

Android多執行-----非同步的方法

在Android專案中,有經驗的開發人員都知道,一些耗時的IO操作等都必須在子執行緒中去操作,那麼可以有哪些方法來開啟子執行緒呢,一般可以使用Java中自帶的幾種方法,也可以使用Andorid特有的一些類。 用Java來實現非同步 主要有兩種方法來實現非同步,繼承Thread類和實現Runnab

執行同步的五方法

2、同步程式碼塊; 3、使用特殊域變數(volatile)實現執行緒同步; volatile關鍵字為域變數的訪問提供了一種免鎖機制 使用volatile修飾域相當於告訴虛擬機器該域可能會被其他執行緒更新 每次使用該域就要重新計算,而不是使用暫存器中的值

Java多執行(十五):多執行同步的五方法

一、為什麼要執行緒同步     因為當我們有多個執行緒要同時訪問一個變數或物件時,如果這些執行緒中既有讀又有寫操作時,就會導致變數值或物件的狀態出現混亂,從而導致程式異常。舉個例子,如果一個銀行賬戶同時被兩個執行緒操作,一個取100塊,一個存錢100塊。假設賬戶原本有0塊,如