Linux基礎 執行緒同步之互斥鎖

2021-10-07 08:35:40 字數 3009 閱讀 2763

共享資源,多個執行緒都可對共享資源操作

執行緒操作共享資源的先後順序不確定

處理器對儲存器的操作一般不是原子操作

比如下面乙個例子:兩個執行緒同時對乙個變數操作(假如對乙個變數i進行加1),有可能就會出現資料混亂(即每執行緒對i+1但是結果不是真正的結果),注意:執行緒是併發的,出現這種情況很正常。下面寫個例子演示一下。

#include

#include

#include

#define nloop 5000

//這裡我讓每個執行緒加5000次

int counter;

//定義乙個全域性變數來讓執行緒自加

//執行緒執行函式

void

*fun

(void

*arg)

return

null;}

intmain

(void

)

當我們把這段函式放到虛擬機器中執行,最後的結果就可能會是10000的結果,或者少於10000的結果,但是,按照正常來說應該要是10000,而少於10000的結果就是資料混亂的結果。

注意:編譯這個檔案的時候要加上-lpthread,比如gcc test.c -o test -lpthread

互斥鎖我們可以想象成在超市的保險櫃(進商場前存放東西的櫃子)。然後把執行緒比喻成乙個人,你進超市的時候,你就要先找到沒有鎖住的櫃子,把櫃子鎖住(表示你正在使用),這樣其他的人(其他的執行緒)就無法再使用這個櫃子了,如果想要使用該櫃子就需要你解鎖,別人才可以使用。

保證在某一時刻只有乙個執行緒能訪問資料的簡便辦法。在任意時刻只允許乙個執行緒對共 享資源進行訪問。如果有多個執行緒試圖同時訪問臨界區,那麼 在有乙個執行緒進入後其他所有試圖訪問此臨界區的執行緒將被掛起,並一直持續到進入臨界區的執行緒離開。臨界區在被釋 放後,其他執行緒可以繼續搶占,並以此達到用原子方式操作共享資源的目的。(你可以這麼認為,這臨界區就是我上面說的櫃子)。

注意:這個臨界區要盡可能的小!太大會影響程式的效能!

pthread_mutex_t mutex = pthread_mutex_initializer;

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

int pthread_mutex_lock(pthread_mutex_t *mutex)

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

注意:常用的就是預設屬性,就是pthread_mutex_init函式的第二個引數傳null

產生原因

同乙個執行緒在擁有a鎖的情況下再次請求獲得a鎖 ,

解決方法:避免兩次加鎖

執行緒一擁有a鎖,請求獲得b鎖;執行緒二擁有b鎖,請求獲得a鎖

解決方法:使用pthread_mutex_trylock,或者某個執行緒先放手

造成結果:那個執行緒也別想用。就會卡住

在下面兩個示例**中,c檔案建立靜態互斥鎖,c++那份**採用動態建立互斥鎖。

2.6.1、基於c的示例**

#include

#include

#include

#define nloop 5000

//用於每個執行緒加5000次

int counter;

//建立乙個全域性變數給執行緒操作

//設計乙個全域性的鎖

pthread_mutex_t mutex = pthread_mutex_initializer;

void

*doit

(void

*vptr)

return

null;}

intmain

(void

)

2.6.2、基於c++的示例**

標頭檔案

#ifndef basethred_mutex_h

#define basethred_mutex_h

#include

#include

#include

class

cbasethread_mutex

#define endif

cpp檔案

#include

"cbase_pthread_mutex.h"

//建構函式建立互斥鎖

cbasethread_mutex::

cbasethread_mutex()

}//析構函式銷毀互斥鎖

cbasethread_mutex::

~cbasethread_mutex()

}//拿鎖函式

bool cbasethread_mutex::

lock()

return ret ==0?

true

:false

}//解鎖函式

bool cbasethread_mutex::

unlock()

return ret ==0?

true

:false

}//試圖拿鎖函式

bool cbasethread_mutex::

trylock()

return ret ==0?

true

:false

}

linux執行緒》同步互斥機制之 互斥鎖

本文基於訊號量 如果訊號量的值最多為1,那實際上相當於乙個共享資源在任意時刻最多只能有乙個執行緒在訪問,這樣的邏輯稱為 互斥 這時,有一種更加方便和語義更加準確的工具來滿足這種邏輯 互斥鎖。幾個執行緒同時去搶乙個鎖,誰搶到了鎖就進門把房間鎖上,訪問資料,出來後之前解鎖。照這樣的邏輯,互斥鎖的操作無非...

執行緒同步之互斥鎖

為什麼要執行緒同步?當多執行緒共享相同的記憶體的時候,需要每乙個執行緒看到相同的檢視。當乙個執行緒被修改時,其他的執行緒也可以修改或者讀取這個變數,所以就需要對這些執行緒同步,保證不會訪問到無效的變數。舉個例子 由此可見,執行緒同步的重要性。執行緒同步之互斥鎖的函式 1.include 2.int ...

linux 執行緒同步問題之互斥鎖

執行緒的特點是乙個輕量級的,所有的執行緒共享相同的資源,這樣一來就產生了問題,多執行緒如何來同步的合理的使用這些資源呢?在linux中提供了三種形式的同步模式,互斥鎖,訊號量,互斥變數三種模型來解決該問題。下來就簡單介紹這幾種情況 1 互斥鎖 mutex 利用互斥鎖來進行執行緒的同步,讓每個執行緒在...