【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);
? ? ? ? 該函數第一個參數為一個互斥量指針,第二個參數為互斥量屬性指針(一般設為NULL)。該函數將按照互斥量屬性對互斥量進行初始化。
互斥量加鎖:
? ? ? ? int?pthread_mutex_lock(pthread_mutex *mutex);
? ? ? ? 該函數申請一個互斥量并對其進行加鎖,使該互斥量對其他線程不可用,讓其他申請互斥量的線程等待。
互斥量解鎖:
? ? ? ? int?pthread_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)
{
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字符串,符合我們的預期。?
? ? ? ? ?通過該示例,讀者可以直觀地感受到互斥量的作用,親身體會互斥量機制,同時能讓讀者了解互斥量的內在原理。
?
來自 <https://blog.csdn.net/lovecodeless/article/details/24885127>
?
總結
以上是生活随笔為你收集整理的【C/C++多线程编程之六】pthread互斥量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品经理欲哭无泪的瞬间(太真实了)
- 下一篇: 如何理解产品经理的核心竞争力