日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C/C++多线程编程之六】pthread互斥量

發布時間:2025/3/15 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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

? ? ? ?不啟用互斥量的情況下,兩個線程對共享資源的訪問是隨機并且無規律,相互干擾打斷,產生ae混合的字符串,這顯然不是我們期望的結果。

? ? ? ?啟用互斥量(去掉注釋)情況下,互斥量機制其作用,兩個線程同步協調地訪問共享資源Share,產生aaaaaaaaeeeeeeee字符串,符合我們的預期。?

? ? ? ? ?通過該示例,讀者可以直觀地感受到互斥量的作用,親身體會互斥量機制,同時能讓讀者了解互斥量的內在原理。

?

來自 <https://blog.csdn.net/lovecodeless/article/details/24885127>

?

總結

以上是生活随笔為你收集整理的【C/C++多线程编程之六】pthread互斥量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。