執行緒同步的常用方式與具體的區別

2021-08-19 04:55:13 字數 2816 閱讀 4802

當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區的執行緒可以訪問被保護起來的資源或**段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止。(臨界區只能同一程序中線程使用,不能跨程序使用) 

臨界資源:同時只允許乙個程序使用的資源。 

臨界區:程序中用於訪問臨界資源的**段,又稱臨界段。 

每個程序的臨界區**可以不同,臨界區**由於要訪問臨界資源,因此要在進入臨界區之前進行檢查,至於每個程序對臨界資源進行怎樣的操作,這和臨界資源及互斥同步管理是無關的。 

使用方式: 

1.定義臨界區物件 

ccriticalsection g_criticalsection;

2.在訪問共享資源(**或變數)之前,先獲得臨界區物件 

g_criticalsection.lock();

3.訪問共享資源後,則放棄臨界區物件 

g_criticalsection.unlock();

臨界區一般使用鎖的方式來實現,常見的互斥鎖和讀寫鎖:提供對臨界資源的保護,當多執行緒試圖訪問臨界資源時,都必須通過獲取鎖的方式來訪問臨界資源。(臨界資源:是被多執行緒共享的資源)當讀寫執行緒獲取鎖的頻率差別不大時,一般採用互斥鎖,如果讀執行緒訪問臨界資源的頻率大於寫執行緒,這個時候採用讀寫鎖較為合適,讀寫鎖允許多個讀執行緒同時訪問臨界資源,讀寫執行緒必須互斥訪問臨界資源。讀寫鎖的實現採用了互斥鎖,所以在讀寫次數差不多的情況下採用讀寫鎖效能沒有直接採用互斥鎖來的高。 

最後總結下關鍵段: 

1.關鍵段共初始化化、銷毀、進入和離開關鍵區域四個函式。 

2.關鍵段可以解決執行緒的互斥問題,但因為具有「執行緒所有權」,所以無法解決同步問題。 

3.推薦關鍵段與旋轉鎖/自旋鎖配合使用。關於鎖,見本文後面

互斥量多用於多程序之間的執行緒互斥,用來確保乙個執行緒獨佔乙個資源的訪問。而且能正確處理資源遺棄的問題(「遺棄」問題就是——占有某種資源的程序意外終止後,其它等待該資源的程序能否感知。,而事件與訊號量都無法處理遺棄問題,更多關於遺棄問題的分析,參考此處) 

互斥物件和臨界區物件非常相似,只是其允許在程序間使用,而臨界區只限制與同一程序的各個執行緒之間使用,但是更節省資源,更有效率。

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_destroy(pthread_mutex *mutex);

int pthread_mutex_unlock(pthread_mutex *

事件機制,則允許乙個執行緒在處理完乙個任務後,主動喚醒另外乙個執行緒執行任務。或者按照條件變數的說法,提供執行緒之間的一種通知機制。

int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);     

int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

int pthread_cond_destroy(pthread_cond_t *cond);

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有執行緒的阻塞

當需要乙個計數器來限制可以使用某共享資源的執行緒數目時,可以使用「訊號量」物件。

訊號量提供對臨界資源的安全分配。如果存在多份臨界資源,在多個執行緒爭搶臨界資源的情況下,向執行緒提供安全分配臨界資源的方法。如果臨界資源的數量為1,將退化為鎖。

ipc方式中也有訊號量,常常配合ipc共享記憶體來使用,作為程序之間以及同一程序不同執行緒間的同步手段。

使用方式: 

csemaphore類物件儲存了對當前訪問某乙個指定資源的執行緒的計數值,該計數值是當前還可以使用該資源的執行緒數目。如果這個計數達到了零,則所有對這個csemaphore類物件所控制的資源的訪問嘗試都被放入到乙個佇列中等待,直到超時或計數值不為零為止。 

執行緒在處理完共享資源後,應在離開的同時通過releasesemaphore()函式將當前可用資源數加1。 

相關函式: 

訊號量函式的名字都以」sem_」打頭。執行緒使用的基本訊號量函式有四個。

#include 

int sem_init (sem_t *sem , int pshared, unsigned

int value);

int sem_wait(sem_t *sem);

int sem_post(sem_t *sem);

這個函式的作用是再我們用完訊號量後都它進行清理。歸還自己占有的一切資源。 

5、令牌:

一種高階的執行緒同步的方法。它既提供鎖的安全訪問臨界資源的功能,又利用了條件變數使得執行緒爭奪臨界資源時是有序的。

2、事件和訊號量都可以實現執行緒和程序間的互斥和同步。但是事件和訊號量都無法解決遺棄問題。 

3、臨界區的效率是最高的,因為它不是核心物件。但是臨界區不能跨程序使用。 

事件,互斥量,訊號量都是核心物件,可以跨程序使用,但相應的效率也會低很多。

執行緒同步的方式

一 什麼是執行緒的同步 當多個執行緒同時訪問其共享的資源時,需要相互協調,以防止出現資料不一致 不完整的問題,能達到這種狀態執行緒同步 二 執行緒同步的方式 1 互斥量 互斥鎖 如果乙個執行緒要訪問一塊資料時,它就呼叫mutex lock,如果互斥量是處於解鎖狀態,也就是說這塊資料可用,那麼就呼叫成...

執行緒的同步方式

併發 同乙個時間段有多個程式在同乙個cpu上輪流執行 並行 同一時間多個程式在不同cpu上同時執行。併發是在時間段的表象,並行是在時刻的表象。同步 執行緒之間具有依賴關係,乙個執行緒的執行依賴於另乙個執行緒的訊息。互斥 對於程序的某一共享資源,同一時刻只允許乙個執行緒訪問。互斥是一種特殊的同步。實現...

執行緒同步的方式

同步 同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。這裡的同步千萬不要理解成那個同時進行,應是指協同 協助 互相配合。執行緒互斥 指對於共享的程序系統資源,在各單個執行緒訪問時的排它性。當有若干個執行緒都要使用某一共享資源時,任何時刻最多隻允許乙個執行緒去使用,其它要使用該資源的執...