多執行緒程式設計之執行緒同步互斥量
pthread是posix threads的簡稱,是posix的執行緒標準。
pthread執行緒同步指多個執行緒協調地,有序地同步使用共享資源。【c/c++多執行緒程式設計之五】pthread執行緒深入理解中講述到,多執行緒共享程序資源,乙個執行緒訪問共享資源需要一段完整地時間才能完成其讀寫操作,如果在這段時間內被其他執行緒打斷,就會產生各種不可預知的錯誤。協調執行緒按一定的規則,不受打擾地訪問共享資源,保證正確性,這便是執行緒同步的出發點。
互斥量,是最簡單的執行緒同步機制,也是最常用的同步策略。
1.互斥量(mutex):
互斥量是一種執行緒同步物件,「互斥」的含義是同一時刻只能有乙個執行緒獲得互斥量。乙個互斥量對應乙個共享資源,互斥量狀態:1.解鎖狀態意味著共享資源可用,2.加鎖狀態意味著共享資源不可用。
乙個執行緒需要使用共享資源時,使用thread_mutex_lock申請:1.當互斥量為解鎖狀態,則占用互斥量,並給互斥量加鎖,占用資源(互相量為加鎖狀態,其他執行緒不能使用互斥量並等待互斥量變為解鎖狀態),2.如果互斥量為加鎖狀態,則執行緒等待,直到互斥量為解鎖狀態(其他執行緒使用完共享資源後會解鎖互斥量,釋放資源)。
2.互斥量基本函式:
#include
初始化互斥量:
intpthread_mutex_init(pthread_mutex *mutex,
const pthread_mutexattr_t* mutexattr);
該函式第乙個引數為乙個互斥量指標,第二個引數為互斥量屬性指標(一般設為null)。該函式將按照互斥量屬性對互斥量進行初始化。
互斥量加鎖:
intpthread_mutex_lock(pthread_mutex *mutex);
該函式申請乙個互斥量並對其進行加鎖,使該互斥量對其他執行緒不可用,讓其他申請互斥量的執行緒等待。
互斥量解鎖:
intpthread_mutex_unlock(pthread_mutex *mutex);
該函式對互斥量進行解鎖操作,使該互斥量對其他執行緒可以。
銷毀互斥量:
int pthread_mutex_destroy(pthread_mutex *mutex);
該函式銷毀乙個不再需要的互斥量,釋放系統資源。
3.牛刀小試:
#include "pthread.h"
#include "sched.h"
#include "semaphore.h"
#include "stdio.h"
#include "windows.h"
#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)
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)
p++;
*p='\0';
printf("2 share is : %s\n",share);
pthread_mutex_unlock(&work_mutex); //解鎖
sleep(100); //啟用互斥量時也去除注釋,為程序排程提供時間
}return null;
}int main()
執行緒my_thread_1將共享資源字串share寫成aaaaaaaa,執行緒my_thread_2則將其寫成eeeeeeee。
不啟用互斥量的情況下,兩個執行緒對共享資源的訪問是隨機並且無規律,相互干擾打斷,產生a和e混合的字串,這顯然不是我們期望的結果。
啟用互斥量(去掉注釋)情況下,互斥量機制其作用,兩個執行緒同步協調地訪問共享資源share,產生aaaaaaaa或eeeeeeee字串,符合我們的預期。
通過該示例,讀者可以直觀地感受到互斥量的作用,親身體會互斥量機制,同時能讓讀者了解互斥量的內在原理。
來自 <>
C C 多執行緒程式設計之四 終止pthread執行緒
多執行緒程式設計之終止pthread執行緒 pthread是posix threads的簡稱,是posix的執行緒標準。終止執行緒似乎是多執行緒程式設計的最後一步,但絕不是本系列教材的結束。執行緒建立到執行緒終止,希望先給讀者乙個關於多執行緒程式設計的整體認識。1.終止pthread執行緒 pthr...
多執行緒程式設計之執行緒取消
關鍵 pthread cancel函式傳送 終止訊號 pthread setcancelstate函式 設定終止方式 pthread testcancel函式取消執行緒 另一功能是 設定取消點 1 執行緒取消的定義 一般情況下,執行緒在其主體函式退出的時候會自動終止,但同時也可以因為接收到另乙個執行...
C C 多執行緒基礎程式設計
1.基本的阻塞型實現 multi thread.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include include include using namespace std void thread01 void thread02 int main...