本週主要學習
執行緒同步機制(
互斥量、讀寫鎖和條件變數)和簡單程式的實現,對執行緒同步有了進一步認識
內容如下:
1、執行緒的基本概念,相關函式
2、互斥量
說明
·處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量;
·處於圓形框中心線之上的線段表示相關的執行緒等待互斥量;
·處於圓形框中心線之下的線段表示相關的執行緒擁有互斥量;
過程描述
·最初,互斥量沒有被加鎖;
·當執行緒
1試圖加鎖該互斥量時,因為沒有競爭,執行緒
1立即加鎖成功,對應線段也移到中心線之下;
·然後執行緒
2試圖加鎖互斥量,由於互斥量已經被加鎖,所以執行緒
2被阻塞,對應線段在中心線之上;
·接著,執行緒
1解鎖互斥量,於是執行緒
2解除阻塞,並對互斥量加鎖成功;
·然後,執行緒
3試圖加鎖互斥量,同樣被阻塞;
·此時,執行緒
1呼叫函式
pthread_mutext_trylock
試圖加鎖互斥量,而立即返回
ebusy;·
然後,執行緒
2解鎖互斥量,解除執行緒
3的阻塞,執行緒
3加鎖成功;
·最後,執行緒
3完成工作,解鎖互斥量
3、讀寫鎖
讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者
只對共享資源進行讀訪問,寫者則需要對共享資源進行寫
操作。這種鎖相對於自旋鎖而言,能提高併發性,因為在多處理器系統中,它允許同時有多個讀者來訪問共享資源,最大可能的讀者數為實際的邏輯
cpu數。寫者是排他性的,乙個讀寫鎖同時只能有乙個寫者或多個讀者(與
cpu數相關),但不能同時既有讀者又有寫者。
**實現功能
:使用讀寫鎖實現四個執行緒讀寫一段程式,共建了四個執行緒,其中兩個執行緒用來讀資料,另外兩個執行緒用來寫資料,在任意時刻,如果有乙個執行緒在寫資料,將阻塞其他執行緒的任何操作。
#include4、條件變數(難點)#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);
}
型別宣告:
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塊 同步方法中無需指定同步監視器,因為同步方法的...