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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux线程-互斥锁pthread_mutex_t

發(fā)布時間:2025/6/15 linux 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux线程-互斥锁pthread_mutex_t 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Linux線程-互斥鎖pthread_mutex_t

在線程實(shí)際運(yùn)行過程中,我們經(jīng)常需要多個線程保持同步。這時可以用互斥鎖來完成任務(wù);互斥鎖的使用過程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock這幾個函數(shù)以完成鎖的初始化,鎖的銷毀,上鎖和釋放鎖操作。


linux下為了多線程同步,通常用到鎖的概念。
posix下抽象了一個鎖類型的結(jié)構(gòu):ptread_mutex_t。通過對該結(jié)構(gòu)的操作,來判斷資源是否可以訪問。顧名思義,加鎖(lock)后,別人就無法打開,只有當(dāng)鎖沒有關(guān)閉(unlock)的時候才能訪問資源。
它主要用如下7個函數(shù)進(jìn)行操作。
1:pthread_mutex_init(pthread_mutex_t * mutex,const pthread_mutexattr_t *attr);
? ?初始化鎖變量mutex。attr為鎖屬性,NULL值為默認(rèn)屬性。
2:pthread_mutex_lock(pthread_mutex_t *mutex);加鎖
3:pthread_mutex_tylock(pthread_mutex_t *mutex);加鎖,但是與2不一樣的是當(dāng)鎖已經(jīng)在使用的時候,返回為EBUSY,而不是掛起等待。
4:pthread_create((pthread_t ?*thread, ?pthread_attr_t ?*attr, ?void ?*(*start_routine)(void ?*), ?void ?*arg)
? ? 功能:創(chuàng)建線程(實(shí)際上就是確定調(diào)用該線程函數(shù)的入口點(diǎn)),在線程創(chuàng)建以后,就開始運(yùn)行相關(guān)的線程函數(shù)。
? ? 說明:thread:線程標(biāo)識符;attr:線程屬性設(shè)置;start_routine:線程函數(shù)的起始地址;arg:傳遞給start_routine的參數(shù);
? ? 返回值:成功,返回0;出錯,返回-1。
5:pthread_mutex_unlock(pthread_mutex_t *mutex);釋放鎖
6:pthread_join(pthread_t tid, void **status);
? ? 功能:pthread_join()函數(shù)會一直阻塞調(diào)用線程,直到指定的線程tid終止。當(dāng)pthread_join()返回之后,應(yīng)用程序可回收
? ? 與已終止線程關(guān)聯(lián)的任何數(shù)據(jù)存儲空間,(另外也可設(shè)置線程attr屬性,當(dāng)線程結(jié)束時直接回收資源)如果沒有必要等待特定的線程
? ? 終止之后才進(jìn)行其他處理,則應(yīng)當(dāng)將該線程分離pthread_detach()。
7:pthread_mutex_destroy(pthread_mutex_t *mutex);使用完后釋放


一,鎖的創(chuàng)建

? ? 鎖可以被動態(tài)或靜態(tài)創(chuàng)建,可以用宏P(guān)THREAD_MUTEX_INITIALIZER來靜態(tài)的初始化鎖,采用這種方式比較容易理解,互斥鎖是pthread_mutex_t的結(jié)構(gòu)體,而這個宏是一個結(jié)構(gòu)常量,如下可以完成靜態(tài)的初始化鎖:
? ? pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
? ? 另外鎖可以用pthread_mutex_init函數(shù)動態(tài)的創(chuàng)建,函數(shù)原型如下:
? ? int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)

二,鎖的屬性

? ? 互斥鎖屬性可以由pthread_mutexattr_init(pthread_mutexattr_t *mattr);來初始化,然后可以調(diào)用其他的屬性設(shè)置方法來設(shè)置其屬性;
? ? 互斥鎖的范圍:可以指定是該進(jìn)程與其他進(jìn)程的同步還是同一進(jìn)程內(nèi)不同的線程之間的同步。可以設(shè)置為PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE。默認(rèn)是后者,表示進(jìn)程內(nèi)使用鎖。可以使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)
pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)
用來設(shè)置與獲取鎖的范圍;

? ? 互斥鎖的類型:有以下幾個取值空間:
  PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當(dāng)一個線程加鎖以后,其余請求鎖的線程將形成一個等待隊列,并在解鎖后按優(yōu)先級獲得鎖。這種鎖策略保證了資源分配的公平性。
  PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時重新競爭。
  PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。這樣就保證當(dāng)不允許多次加鎖時不會出現(xiàn)最簡單情況下的死鎖。
  PTHREAD_MUTEX_ADAPTIVE_NP,適應(yīng)鎖,動作最簡單的鎖類型,僅等待解鎖后重新競爭。

可以用
pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)
獲取或設(shè)置鎖的類型。

三,鎖的釋放

? ? 調(diào)用pthread_mutex_destory之后,可以釋放鎖占用的資源,但這有一個前提上鎖當(dāng)前是沒有被鎖的狀態(tài)。

四,鎖操作

? ? 對鎖的操作主要包括加鎖 pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖 pthread_mutex_trylock()三個。

?  int pthread_mutex_lock(pthread_mutex_t *mutex)

  int pthread_mutex_unlock(pthread_mutex_t *mutex)

  int pthread_mutex_trylock(pthread_mutex_t *mutex)

  pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經(jīng)被占據(jù)時返回EBUSY而不是掛起等待


五,鎖的使用

例子1:

#include <pthread.h> #include <stdio.h>pthread_mutex_t mutex ; void *print_msg(void *arg){int i=0;pthread_mutex_lock(&mutex);for(i=0;i<15;i++){printf("output : %d\n",i);usleep(100);}pthread_mutex_unlock(&mutex); } int main(int argc,char** argv){pthread_t id1;pthread_t id2;pthread_mutex_init(&mutex,NULL);pthread_create(&id1,NULL,print_msg,NULL);pthread_create(&id2,NULL,print_msg,NULL);pthread_join(id1,NULL);pthread_join(id2,NULL);pthread_mutex_destroy(&mutex);return 1; }

例子2:

下面經(jīng)典例子為創(chuàng)建兩個線程對sum從1加到100。前面第一個線程從1-49,后面從50-100。主線程讀取最后的加值。為了防止資源競爭,用了pthread_mutex_t 鎖操作。

#include<stdlib.h> #include<stdio.h> #include<unistd.h> #include<pthread.h> typedef struct ct_sum { int sum;pthread_mutex_t lock; }ct_sum; void * add1(void * cnt) { pthread_mutex_lock(&(((ct_sum*)cnt)->lock));int i;for( i=0;i<50;i++){(*(ct_sum*)cnt).sum+=i;}pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));pthread_exit(NULL);return 0; } void * add2(void *cnt) { int i;cnt= (ct_sum*)cnt;pthread_mutex_lock(&(((ct_sum*)cnt)->lock));for( i=50;i<101;i++){ (*(ct_sum*)cnt).sum+=i; }pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));pthread_exit(NULL);return 0; } int main(void) { int i;pthread_t ptid1,ptid2;int sum=0;ct_sum cnt;pthread_mutex_init(&(cnt.lock),NULL);cnt.sum=0;pthread_create(&ptid1,NULL,add1,&cnt);pthread_create(&ptid2,NULL,add2,&cnt);pthread_mutex_lock(&(cnt.lock));printf("sum %d\n",cnt.sum);pthread_mutex_unlock(&(cnt.lock));pthread_join(ptid1,NULL);pthread_join(ptid2,NULL);pthread_mutex_destroy(&(cnt.lock));return 0; }

總結(jié)

以上是生活随笔為你收集整理的Linux线程-互斥锁pthread_mutex_t的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天操操| 亚洲色成人www永久在线观看 | 性欧美精品中出 | 刘亦菲毛片一区二区三区 | 国产尤物在线 | 麻豆国产尤物av尤物在线观看 | 欧美亚洲日本 | 一级免费观看视频 | 亚洲av无码不卡 | 我爱av好色 | av毛片在线看 | 深夜福利视频导航 | 国产av一区二区三区最新精品 | 国产精品成人久久 | 黄色美女av | 黄视频免费在线看 | 欧美一区二区三区 | 免费在线观看黄网站 | 亚洲国产精品久久久久爰色欲 | 美女被揉胸视频 | 色欲久久久天天天精品综合网 | 国产av人人夜夜澡人人爽麻豆 | 欧美无吗| 亚洲欧美日韩偷拍 | 成年人久久| 中文字幕 成人 | yw视频在线观看 | 日日摸夜夜添狠狠添欧美 | 欧美一区二区三区在线播放 | a一级黄色 | 亚洲天堂123 | 九九精品在线播放 | 午夜在线免费视频 | 色不卡| 99久久国| 亚洲激情av| 久久久免费毛片 | 欧美日韩精品在线视频 | 91高清视频免费观看 | jzjzjz欧美丰满少妇 | 欧美一级片在线看 | 中文字幕在线免费观看 | 久久精久久 | 国产精品一区av | 欧洲精品一区二区三区 | 成人91视频 | 视频一区二区三区四区五区 | 国产成人无码精品久久久性色 | 日皮毛片 | 欧美熟妇另类久久久久久不卡 | 一区二区手机在线 | 久久综合亚洲精品 | 国产精品久久久久久久妇 | 成人免费入口 | 刘亦菲一区二区三区免费看 | 97超碰人人模人人人爽人人爱 | 美女又黄又免费 | 久久av无码精品人妻出轨 | 久艹在线视频 | 欧美在线一区二区 | 日韩欧美久久 | 国产探花精品一区二区 | 国产精品人人做人人爽人人添 | hs网站在线观看 | 九九免费精品视频 | 久久久久久亚洲av无码专区 | 男女激情视频网站 | 朋友人妻少妇精品系列 | 激情午夜网 | 欧美色综合网站 | 国产精品污www一区二区三区 | 一起艹在线观看 | 亚洲av无码国产精品永久一区 | 性高潮久久久久 | 美女扒开腿让男生桶 | 成年在线观看 | 久久精品66 | 国产你懂得 | 免费成人深夜夜国外 | 91涩涩视频| 欧美h网站 | 天天干天天操天天拍 | 国产无遮挡18禁无码网站不卡 | 91蝌蚪在线| av啊啊 | 成人免费视频视频 | 伊人久操视频 | 日日干天天射 | 日本国产在线视频 | 成人久久18免费网站图片 | 五月花婷婷 | 骑骑上司妻电影 | 老司机福利院 | 久久精品www人人爽人人 | 97久久综合 | www.色com | 黄网在线免费观看 | 日韩精品一区二区在线看 | 午夜国产免费 |