執行緒同步機制

2021-08-06 06:32:02 字數 4105 閱讀 9093

本週主要學習

執行緒同步機制(

互斥量、讀寫鎖和條件變數)和簡單程式的實現,對執行緒同步有了進一步認識

內容如下:

1、執行緒的基本概念,相關函式

2、互斥量

說明

·處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量;

·處於圓形框中心線之上的線段表示相關的執行緒等待互斥量;

·處於圓形框中心線之下的線段表示相關的執行緒擁有互斥量;

過程描述

·最初,互斥量沒有被加鎖;

·當執行緒

1試圖加鎖該互斥量時,因為沒有競爭,執行緒

1立即加鎖成功,對應線段也移到中心線之下;

·然後執行緒

2試圖加鎖互斥量,由於互斥量已經被加鎖,所以執行緒

2被阻塞,對應線段在中心線之上;

·接著,執行緒

1解鎖互斥量,於是執行緒

2解除阻塞,並對互斥量加鎖成功;

·然後,執行緒

3試圖加鎖互斥量,同樣被阻塞;

·此時,執行緒

1呼叫函式

pthread_mutext_trylock

試圖加鎖互斥量,而立即返回

ebusy;·

然後,執行緒

2解鎖互斥量,解除執行緒

3的阻塞,執行緒

3加鎖成功;

·最後,執行緒

3完成工作,解鎖互斥量

3、讀寫鎖

讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者

只對共享資源進行讀訪問,寫者則需要對共享資源進行寫

操作。這種鎖相對於自旋鎖而言,能提高併發性,因為在多處理器系統中,它允許同時有多個讀者來訪問共享資源,最大可能的讀者數為實際的邏輯

cpu數。寫者是排他性的,乙個讀寫鎖同時只能有乙個寫者或多個讀者(與

cpu數相關),但不能同時既有讀者又有寫者。

**實現功能

:使用讀寫鎖實現四個執行緒讀寫一段程式,共建了四個執行緒,其中兩個執行緒用來讀資料,另外兩個執行緒用來寫資料,在任意時刻,如果有乙個執行緒在寫資料,將阻塞其他執行緒的任何操作。

#include 

#include

#include

#include

#include

static pthread_rwlock_t rwlock;

#define work_size 1024

char work_area[work_size];

int time_to_exit;

void *thread_function_read_o(void *arg); //read

void *thread_function_read_t(void *arg);

void *thread_function_write_o(void *arg); //write

void *thread_function_write_t(void *arg);

int main(int argc,char *argv)

res = pthread_create(&a_thread, null, thread_function_read_o, null);

if (res != 0)

res = pthread_create(&b_thread, null, thread_function_read_t, null);//create new thread

if (res != 0)

res = pthread_create(&c_thread, null, thread_function_write_o, null);//create new thread

if (res != 0)

res = pthread_create(&d_thread, null, thread_function_write_t, null);//create new thread

if (res != 0)

res = pthread_join(a_thread, &thread_result);//等待a_thread執行緒結束

if (res != 0)

res = pthread_join(b_thread, &thread_result);

if (res != 0)

res = pthread_join(c_thread, &thread_result);

if (res != 0)

res = pthread_join(d_thread, &thread_result);

if (res != 0)

pthread_rwlock_destroy(&rwlock);//銷毀讀寫鎖

exit(exit_success);

}void *thread_function_read_o(void *arg)

}

pthread_rwlock_unlock(&rwlock);

time_to_exit=1;

pthread_exit(0);

}void *thread_function_read_t(void *arg)

}pthread_rwlock_unlock(&rwlock);

time_to_exit=1;

pthread_exit(0);

}void *thread_function_write_o(void *arg)

pthread_rwlock_unlock(&rwlock);

pthread_exit(0);

}void *thread_function_write_t(void *arg)

pthread_rwlock_unlock(&rwlock);//解鎖

pthread_exit(0);

}

4、條件變數(難點)

型別宣告:

pthread_cond_t cond; 

對條件變數的初始化:

程式在使用

pthread_cond_t

變數之前必須對其進行初始化。對於靜態的

pthread_cond_t

變數來說,是要將

pthread_cond_initializer

賦給變數;

對於動態分配的或沒有預設屬性的變數來說,就要呼叫

pthread_cond_init

函式來執行初始化。

對條件變數的操作:

int pthread_cond_wait(pthread_cond_* cond,pthread_mutex_t* mutex);//

使執行緒阻塞於某個條件。

int pthread_cond_signal(pthread_cond_t* cond);//

喚醒某個阻塞在cond上的執行緒。

對條件變數的銷毀:

int pthread_cond_destroy(pthread_cond_t* cond); 

**實現功能:乙個int型全域性變數g_flag初始值為0,在主線程中啟動執行緒1,列印「this is thread1」,將g_flag設定為1,

#include

#include

#include

#include

#include

typedef void* (*fun)(void*);

int g_flag=0;

static pthread_mutex_t mutex = pthread_mutex_initializer;

static pthread_cond_t cond = pthread_cond_initializer;

void* thread1(void*);

void* thread2(void*);

int main(int argc, char** argv)

void* thread1(void* arg)

void* thread2(void* arg)

執行緒同步機制

執行緒同步主要用於協調對臨界資源的訪問,臨界資源可以是硬體裝置 比如印表機 磁碟 檔案 記憶體 變數 陣列 佇列等 執行緒同步有4種機制 他們的主要區別在於 各同步機制詳細的功能說明如下 臨界區臨界區是一段獨佔對某些共享資源訪問的 在任意時刻只允許乙個執行緒對共享資源進行訪問。如果有多個執行緒試圖同...

執行緒同步機制

執行緒同步的四種機制 主要區別在於 適用範圍 臨界區在使用者模式下,不會發生使用者態到核心態的切換,只能用於同程序內線程間同步。其他會導致使用者態到核心態的切換,利用核心物件實現,可用於不同程序間的執行緒同步。效能 臨界區效能較好,一般只需要數個cpu週期。其他機制效能相對較差,一般需要數十個cpu...

執行緒同步機制

多個執行緒操作同乙個資源 併發 同乙個物件被多個執行緒同時操作 解決方式 佇列 鎖,佇列為了按序訪問物件,當乙個執行緒獲得物件的排他鎖,獨佔資源,其他執行緒必須等待,使用後釋放鎖即可.存在以下問題 synchronized方法和synchronized塊 同步方法中無需指定同步監視器,因為同步方法的...