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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

RAII实现的mutex资源类

發布時間:2025/5/22 ChatGpt 145 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RAII实现的mutex资源类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

RAII,指的是Resource Acquisition is Initialization。即使用資源時對資源初始化,使用完畢進行自動釋放。它利用stack上的臨時對象生命期是程序自動管理的這一特點,將我們的資源釋放操作封裝在一個臨時對象中。

當我們使用多線程時,需要保證線程安全,這就需要對資源進行加鎖。Linux下使用pthread_mutex_t實現不可重入。我們可以用RAII的手法對mutex進行封裝。

封裝

class MutexLock { public:MutexLock() {pthread_mutex_init(&mutex_, NULL);cout << "construct of MutexLock" << endl;}~MutexLock() {cout << "deconstruct of MutexLock" << endl;pthread_mutex_destroy(&mutex_);}void lock() {pthread_mutex_lock(&mutex_);//lock不上的線程會被阻塞}void unlock() {pthread_mutex_unlock(&mutex_);}private:MutexLock(const MutexLock &);MutexLock& operator=(const MutexLock &); pthread_mutex_t mutex_; };class MutexLockGuard { public:explicit MutexLockGuard(MutexLock &mutex): mutex_(mutex) {cout << "construct of MutexLockGuard" << endl;mutex_.lock();}~MutexLockGuard() {cout << "deconstruct of MutexLockGuard" << endl;mutex_.unlock();}private:MutexLockGuard(const MutexLock &);MutexLockGuard& operator=(const MutexLock &);MutexLock &mutex_; };

MutexLock類的構造函數初始化互斥鎖,析構函數銷毀互斥鎖。它封裝了臨界區,位于lock()和unlock()調用之間。

MutexLockGuard類的構造函數對臨界區進行加鎖操作,進入臨界區,保證了不可重入。析構函數解鎖,退出臨界區。

MutexLockGuard類一般是一個棧對象,它的作用域剛好等于臨界區域。

應用

MutexLock mutex; int cnt = 5;void *f(void *arg){long t_num = (long) arg;while(true){MutexLockGuard lock(mutex);if(cnt>0){usleep(1);cout << "args: " << t_num << " " << "cnt: " << cnt-- << endl; } else{break;} }return NULL; }int main() {pthread_t tid, tid1, tid2, tid3;int ret = pthread_create(&tid, NULL, f,(void*)11);if(ret == -1){perror("create error\n");}ret = pthread_create(&tid1, NULL, f, (void*)22);if(ret == -1){perror("create error\n");}ret = pthread_create(&tid2, NULL, f, (void*)33);if(ret == -1){perror("create error\n");}ret = pthread_create(&tid3, NULL, f, (void*)44);if(ret == -1){perror("create error\n");}pthread_join(tid, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_join(tid3, NULL);return 0; }

程序打開四個線程進行測試,打印結果如下:

construct of MutexLock construct of MutexLockGuardconstruct of MutexLockGuard args: 11 cnt: 5 deconstruct of MutexLockGuardconstruct of MutexLockGuard construct of MutexLockGuardconstruct of MutexLockGuard args: 11 cnt: 4 deconstruct of MutexLockGuardconstruct of MutexLockGuard args: 11 cnt: 3 deconstruct of MutexLockGuardconstruct of MutexLockGuard args: 33 cnt: 2 deconstruct of MutexLockGuardconstruct of MutexLockGuard args: 33 cnt: 1 deconstruct of MutexLockGuardconstruct of MutexLockGuard deconstruct of MutexLockGuarddeconstruct of MutexLockGuard deconstruct of MutexLockGuard deconstruct of MutexLockGuard deconstruct of MutexLock

這個結果有點詭異。當四個線程初始化時,生成了兩個MutexLockGuard實例。其中一個獲取到了mutex鎖,另一個進程阻塞。對cnt進行操作后,釋放了mutex鎖。

然后主線程繼續生成另外兩個MutexLockGuard實例。主線程未直接生成四個實例是因為

The main() thread is possibly not creating all threads before it gets preempted by one of its child threads.

接下來發生的事情是:

args: 11獲取鎖,釋放鎖,cnt--

args: 11獲取鎖,釋放鎖,cnt--

args: 33獲取鎖,釋放鎖,cnt--

args: 33獲取鎖,釋放鎖,cnt--

某個進程進入后break。

具體可以參見OS討論。

All the threads construct a MutexLockGuard but only one is permitted to acquire the mutex and proceed (as intended).

However, when that one destroys its MutexLockGuard and releases the mutex, it turns out that it loops around and creates a new MutexLockGuard and acquires the mutex before the system unblocks another thread and allows them to acquire the mutex.

Mutex acquisition is not guaranteed to be fair. The system may act like this in an attempt to prevent spending work switching threads.

其實爭搶到mutex的線程中局部變量MutexLockGuard實例的生存期位于while中,其它未爭搶到mutex的線程阻塞沒有執行到下一個while,所以不調用析構函數。

當所有局部的MutexLockGuard析構后,全局的MutexLock在最后自動析構。

參考

Linux多線程服務端編程

轉載于:https://my.oschina.net/lvyi/blog/425668

總結

以上是生活随笔為你收集整理的RAII实现的mutex资源类的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲精品久久久久久久久久久 | 午夜黄色影院 | 亚洲无码高清精品 | 黄a网站 | 亲嘴脱内衣内裤 | 精品国产制服丝袜高跟 | 青草精品视频 | 涩视频在线观看 | 亚洲a中文字幕 | a视频在线观看免费 | 在线免费黄色片 | www.波多野结衣.com | 亚洲 美腿 欧美 偷拍 | 无码人妻丰满熟妇精品 | 中国av一区二区 | 成人精品一区二区三区中文字幕 | 欧美日韩一区视频 | 日本精品一区二区 | 熟女俱乐部一区二区视频在线 | 超碰超在线 | 伊人亚洲综合 | 成人日韩精品 | 色爱综合 | 91肉色超薄丝袜脚交一区二区 | 久久国产精品久久久久久 | 精品国产大片大片大片 | 超碰人人射 | 亚洲视频在线观看网址 | 成年人av网站 | 在线h网站 | 男人激烈吮乳吃奶爽文 | 在线天堂1 | 国产av天堂无码一区二区三区 | 香蕉一区二区三区四区 | 亚洲精品第一 | 黄色av网站在线播放 | 激情五月婷婷 | 国产性生活网站 | 亚洲午夜精品一区二区三区 | 美女写真福利视频 | 欧美精品久久久 | 少妇又色又爽又黄的视频 | 久久青青草原亚洲av无码麻豆 | 国产av成人一区二区三区 | 日韩久久不卡 | 激情777| 欧美国产乱视频 | 亚洲欧美日韩第一页 | 国产人妖ts| 4hu最新网址 | 自宅警备员在线观看 | 欧美中文字幕在线播放 | 色爱视频 | 国产伦精品一区二区三区 | 青青草视频在线观看 | 亚洲在线观看免费 | av一级 | 日韩经典一区 | 日韩中文字幕一区二区三区 | aaaaav | 欧美乱码视频 | 亚洲最大毛片 | 麻豆一区二区在线 | 波多野结衣丝袜 | 92精品 | 久久免费看少妇高潮v片特黄 | 黄色一级a毛片 | 激情五月激情综合 | 欧美mv日韩mv国产网站 | 差差差30分钟 | 河北彩花69xx精品一区 | 不卡二区 | 国产欧美综合一区 | 色综合加勒比 | 日韩av免费在线看 | 自拍偷拍视频在线 | 欧美性受xxxx黑人xyx性 | 在线色网站 | 欧美一卡二卡 | 小妹色播影院 | 毛片毛片| 中文字幕人妻精品一区 | 久久久久久高清 | 中文字幕免费视频观看 | 首尔之春在线观看 | 国产又粗又大又爽视频 | 免费a级片视频 | 哪里可以免费看毛片 | 红桃视频一区 | 丁香六月综合 | 大肉大捧一进一出好爽mba | 日本免费一区二区视频 | 黄色av片三级三级三级免费看 | 国产网址在线观看 | 久久国产网站 | 亚洲天堂v | 色婷婷久久久亚洲一区二区三区 | 日韩一级高清 | 女王脚交玉足榨精调教 |