ubuntu下C的多執行緒的執行緒同步

2021-10-09 04:14:27 字數 1463 閱讀 5024

為什麼需要執行緒同步

因為在多執行緒環境中,執行緒之間由於競爭共享資源(臨界資源)容易引起資料不一致的問題。一般採用互斥鎖(互斥訊號量)解決,保證只有乙個執行緒進入臨界區。

這篇文章就講互斥鎖,讀寫鎖

互斥量(mutex):主要用於保護共享資料,確保同一時間只有乙個執行緒訪問資料。互斥量從本質上來說是一把鎖,在訪問共享資源前對互斥量進行加鎖,訪問完成後釋放互斥量(解鎖)。對互斥量進行加鎖之後,任何其他試圖再次對互斥量加鎖的執行緒都會被阻塞直到當前執行緒釋放該互斥鎖。這樣就可以保證每次只有乙個執行緒可以向前執行。

讀寫鎖(reader-writer lock):讀寫鎖也叫做共享互斥鎖(shared-exclusive

lock),它有三種狀態:讀模式下加鎖狀態、寫模式下加鎖狀態、不加鎖狀態。一次只能有乙個執行緒可以占有寫模式的讀寫鎖,但是多個執行緒可以同時戰友讀模式的讀寫鎖。因此與互斥量相比,讀寫鎖允許更高的並行性。讀寫鎖非常適合對資料結構讀的次數遠大於寫的情況。

方法1:互斥鎖

例項**:

#include

#include

#include

#include

//使用巨集定義以及初始化鎖

pthread_mutex_t mutex = pthread_mutex_initializer;

int sum =0;

//執行緒函式1

void

*thr1

(void

*arg)

}//執行緒函式2

void

*thr2

(void

*arg)

}int

main()

方法2:讀寫鎖

讀寫鎖,特點是:讀共享,寫獨享,寫優先順序高,讀寫之間也是互斥的。適合讀執行緒較多的場景。

例項**:

#include

#include

#include

int beginnum =

1000

;//使用巨集定義以及初始化鎖

pthread_rwlock_t rwlock = pthread_rwlock_initializer;

void

*thr_write

(void

*arg)

return

null;}

void

*thr_read

(void

*arg)

return

null;}

intmain()

for(i =

0; i<

8; i++

)for

(i =

0; i<

8; i++

)return0;

}

ubuntu多執行緒

執行緒建立之後馬上就開始執行,與主線程一起執行,先後順序隨機,函式pthread join用來等待乙個執行緒的結束。標頭檔案 include 函式定義 int pthread join pthread t thread,void retval 描述 pthread join 函式,以阻塞的方式等待t...

Linux下多執行緒的執行緒保護

目錄 一 開發環境 二 互斥鎖 系統 ubuntu16.04 執行緒庫 pthread 語言 c c linux下的執行緒保護,最常用的是互斥鎖 條件變數 訊號量和讀寫鎖。先來試一下互斥鎖吧 多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,...

windows下C多執行緒

看到乙個簡單的windows程式設計例項,給大家分享一下 這個例項主要用createthread為乙個宣告的方法建立乙個程序,這個被建立的方法必須用dword winapi 修飾,需要有lpvoid 型別的引數,如果沒有這個引數,在建立程序時要對這個方法強制型別中轉換 dword winapi my...