【C/C++多執行緒程式設計之六】pthread互斥量
多執行緒程式設計之執行緒同步互斥量
Pthread是 POSIX threads 的簡稱,是POSIX的執行緒標準。
Pthread執行緒同步指多個執行緒協調地,有序地同步使用共享資源。【C/C++多執行緒程式設計之五】pthread執行緒深入理解中講述到,多執行緒共享程式資源,一個執行緒訪問共享資源需要一段完整地時間才能完成其讀寫操作,如果在這段時間內被其他執行緒打斷,就會產生各種不可預知的錯誤。協調執行緒按一定的規則,不受打擾地訪問共享資源,保證正確性,這便是執行緒同步的出發點。
互斥量,是最簡單的執行緒同步機制,也是最常用的同步策略。
1.互斥量(mutex):
互斥量是一種執行緒同步物件,“互斥”的含義是同一時刻只能有一個執行緒獲得互斥量。一個互斥量對應一個共享資源,互斥量狀態:1.解鎖狀態意味著共享資源可用,2.加鎖狀態意味著共享資源不可用。
一個執行緒需要使用共享資源時,使用thread_mutex_lock申請:1.當互斥量為解鎖狀態,則佔用互斥量,並給互斥量加鎖,佔用資源(互相量為加鎖狀態,其他執行緒不能使用互斥量並等待互斥量變為解鎖狀態),2.如果互斥量為加鎖狀態,則執行緒等待,直到互斥量為解鎖狀態(其他執行緒使用完共享資源後會解鎖互斥量,釋放資源)。
2.互斥量基本函式:
#include <pthread.h>
初始化互斥量:
int pthread_mutex_init(pthread_mutex *mutex,
const pthread_mutexattr_t* mutexattr);
初始化互斥量:
int pthread_mutex_init(pthread_mutex *mutex,
const pthread_mutexattr_t* mutexattr);
該函式第一個引數為一個互斥量指標,第二個引數為互斥量屬性指標(一般設為NULL)。該函式將按照互斥量屬性對互斥量進行初始化。
互斥量加鎖:
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_lock(pthread_mutex *mutex);
該函式申請一個互斥量並對其進行加鎖,使該互斥量對其他執行緒不可用,讓其他申請互斥量的執行緒等待。
互斥量解鎖:
int pthread_mutex_unlock(pthread_mutex *mutex);
互斥量解鎖:
int pthread_mutex_unlock(pthread_mutex *mutex);
該函式對互斥量進行解鎖操作,使該互斥量對其他執行緒可以。
銷燬互斥量:
int pthread_mutex_destroy(pthread_mutex *mutex);
銷燬互斥量:
int pthread_mutex_destroy(pthread_mutex *mutex);
該函式銷燬一個不再需要的互斥量,釋放系統資源。
3.牛刀小試:
#include
#include
#include
#include
#pragma comment(lib, "pthreadVC2.lib") //必須加上這句
pthread_t t1; //pthread_t變數t1,用於獲取執行緒1的ID
pthread_t t2; //pthread_t變數t2,用於獲取執行緒2的ID
char Share[10]; //共享資源區
pthread_mutex_t work_mutex; //宣告互斥量work_mutex
void* My_thread_1(void* args){
while(1){
char *p=Share;
//pthread_mutex_lock(&work_mutex); //加鎖
for(int i=0;i<9;i++)
{
*p='a'; //執行緒1將Share寫成aaaaaaaa
Sleep(100);
p++;
}
p++;
*p='\0';
printf("1 Share is : %s\n",Share);
//pthread_mutex_unlock(&work_mutex); //解鎖
//Sleep(100) //啟用互斥量時也去除註釋,為程式排程提供時間
}
return NULL;
}
void* My_thread_2(void* args){
while(1){
char *p=Share;
//pthread_mutex_lock(&work_mutex); //加鎖
for(int i=0;i<9;i++)
{
*p='e'; //執行緒1將Share寫成eeeeeeee
Sleep(150);
p++;
}
p++;
*p='\0';
printf("2 Share is : %s\n",Share);
//pthread_mutex_unlock(&work_mutex); //解鎖
//Sleep(100) //啟用互斥量時也去除註釋,為程式排程提供時間
}
return NULL;
}
int main(){
//pthread_mutex_init(&work_mutex, NULL); //初始化互斥量
pthread_create(&t1,NULL,My_thread_1,NULL);
pthread_create(&t2,NULL,My_thread_2,NULL);
Sleep(1000000);
//pthread_mutex_destroy(&work_mutex); //銷燬互斥量
return 0;
}
執行緒My_thread_1將共享資源字串Share寫成aaaaaaaa,執行緒My_thread_2則將其寫成eeeeeeee。
不啟用互斥量的情況下,兩個執行緒對共享資源的訪問是隨機並且無規律,相互干擾打斷,產生a和e混合的字串,這顯然不是我們期望的結果。
啟用互斥量(去掉註釋)情況下,互斥量機制其作用,兩個執行緒同步協調地訪問共享資源Share,產生aaaaaaaa或eeeeeeee字串,符合我們的預期。
通過該示例,讀者可以直觀地感受到互斥量的作用,親身體會互斥量機制,同時能讓讀者瞭解互斥量的內在原理。
相關文章
- 【C/C++多執行緒程式設計之七】pthread訊號量C++執行緒程式設計thread
- 【C/C++多執行緒程式設計之十】pthread執行緒私有資料C++執行緒程式設計thread
- 【C/C++多執行緒程式設計之九】pthread讀寫鎖C++執行緒程式設計thread
- 【C/C++多執行緒程式設計之八】pthread條件變數C++執行緒程式設計thread變數
- C++-(25)-多執行緒-POSIX(3)-互斥量-pthread_mutexC++執行緒threadMutex
- C#多執行緒學習(六) 互斥物件C#執行緒物件
- C++ 多執行緒框架 (2):Mutex 互斥和 Sem 訊號量C++執行緒框架Mutex
- C++ 多執行緒程式設計總結C++執行緒程式設計
- Linux C++ 多執行緒程式設計LinuxC++執行緒程式設計
- c++多執行緒程式設計:C2672C++執行緒程式設計
- C++11多執行緒程式設計(二)——互斥鎖mutex用法C++執行緒程式設計Mutex
- windows多執行緒同步--互斥量Windows執行緒
- 程式設計思想之多執行緒與多程式(4):C++ 中的多執行緒程式設計執行緒C++
- C++多執行緒筆試程式設計題C++執行緒筆試程式設計
- 【C++11多執行緒入門教程】系列之互斥量mutexC++執行緒Mutex
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- C語言 之 多執行緒程式設計C語言執行緒程式設計
- Java 多執行緒併發程式設計之互斥鎖 Reentrant LockJava執行緒程式設計
- c++實現程式與執行緒的同步互斥C++執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- VC多執行緒 C++ 多執行緒執行緒C++
- C#多執行緒程式設計C#執行緒程式設計
- c++ 程式通用多執行緒單例設計 c++ web 框架設計經驗談C++執行緒單例Web框架
- C++ 多執行緒C++執行緒
- c++多執行緒C++執行緒
- C++ Builder 多執行緒程式設計技術經驗談C++UI執行緒程式設計
- C#多執行緒程式設計實戰1.1建立執行緒C#執行緒程式設計
- C#多執行緒程式設計(1):執行緒的啟動C#執行緒程式設計
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- pthread 多執行緒基礎thread執行緒
- C#多執行緒程式設計例項C#執行緒程式設計
- 多執行緒程式設計執行緒程式設計
- C# 多執行緒學習(6) :互斥物件C#執行緒物件
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- 實驗六 Java多執行緒設計Java執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- C++使用Boost多執行緒C++執行緒