【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++-(25)-多執行緒-POSIX(3)-互斥量-pthread_mutexC++執行緒threadMutex
- Linux C++ 多執行緒程式設計LinuxC++執行緒程式設計
- c++多執行緒程式設計:C2672C++執行緒程式設計
- C++11多執行緒程式設計(二)——互斥鎖mutex用法C++執行緒程式設計Mutex
- C語言 之 多執行緒程式設計C語言執行緒程式設計
- 【C++11多執行緒入門教程】系列之互斥量mutexC++執行緒Mutex
- Linux C/C++程式設計中的多執行緒程式設計基本概念LinuxC++程式設計執行緒
- c++ 程式通用多執行緒單例設計 c++ web 框架設計經驗談C++執行緒單例Web框架
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- c++多執行緒C++執行緒
- C++ 多執行緒C++執行緒
- pthread 多執行緒基礎thread執行緒
- C++多執行緒:atomicC++執行緒
- C#多執行緒程式設計實戰1.1建立執行緒C#執行緒程式設計
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- 實驗六 Java多執行緒設計Java執行緒
- 多執行緒C++更新MYSQL執行緒C++MySql
- C++多執行緒學習C++執行緒
- C++使用Boost多執行緒C++執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- iOS多執行緒(Pthread、NSThread、GCD、NSOperation)iOS執行緒threadGC
- 用Pthread實現多執行緒操作thread執行緒
- python 多執行緒程式設計Python執行緒程式設計
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- 深入淺出Win32多執行緒程式設計--之MFC的多執行緒Win32執行緒程式設計
- Linux之執行緒互斥鎖Linux執行緒
- Java併發程式設計,互斥同步和執行緒之間的協作Java程式設計執行緒
- C++多執行緒基礎教程C++執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- C#多執行緒(四)並行程式設計篇之結構化C#執行緒並行行程程式設計
- 多執行緒程式設計ExecutorService用法執行緒程式設計
- 29. 多執行緒程式設計執行緒程式設計
- C++11併發程式設計:多執行緒std::threadC++程式設計執行緒thread
- 多程式之間的執行緒利用XSI IPC共享記憶體分配互斥量進行同步執行緒記憶體
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- C++中的多執行緒及其之後的周邊C++執行緒