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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy)

發布時間:2024/9/30 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、條件變量的認識

(1)條件變量的引出:
各個線程訪問共享資源,比如說共享資源是一個空資源,那么,各線程的訪問其實都是無效訪問,因此需要一個機制,首先阻塞線程,以免其錯誤訪問,待條件滿足時(比如 共享資源不為空了),告知各線程開始訪問共享資源即,在不滿足某種條件下,我希望代碼阻塞一會,待滿足某種條件后,再讓各線程工作,所謂某種條件就是條件變量。
(2)條件變量不是鎖!但條件變量能夠阻塞線程。
(3)如何實現線程同步 :
與鎖配合使用:條件變量(引起阻塞)+ 互斥鎖(保護一塊共享數據)。
(4)條件變量的兩個動作:
條件不滿足,阻塞線程;
條件滿足,通知阻塞的線程開始工作 。
(5)條件變量的經典模型:生產者和消費者模型

二、條件變量的操作函數

條件變量函數的返回值都是:成功返回 0, 失敗直接返回錯誤號

pthread_cond_t cond; // 定義一個條件變量(condtion)

(1)初始化一個條件變量
函數說明:

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

使用:

pthread_cond_init ( & cond, NULL);//參數 2 條件變量的屬性,一般傳 NULL

(2)阻塞等待一個條件變量
函數說明:

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

使用:

pthread_cond_t cond // 初始化后的條件變量 pthread_mutex_t mutex; // 初始化后的互斥鎖 pthread_cond_wait(&cond, &mutex);

作用:
1)阻塞等待條件變量 cond(參數 1)滿足
2.)釋放已掌握的互斥鎖,相當于 pthread_mutex_unlock(&mutex);
注意:前 2 步是原子操作
3)當被喚醒,pthread_cond_wait 函數返回時,解除阻塞
重新申請獲取互斥鎖 pthread_mutex_lock(&mutex);
此處的 3 個作用,其實本質是著“生產者消費者模型”的工作流程。如下圖所示:

消費者去消費,即訪問頭結點,因此在訪問頭結點前,先加互斥鎖,發現頭結點為空,此時由于條件變量,消費者被阻塞在此(等待生產者生產) 【pthread_cond_wait() 作用 1】,
此時,生產者生產,但遇到了消費者加的互斥鎖,按理說無法生產,因此,這里涉及【pthread_cond_wait() 作用 2】,會將消費者已掌握的互斥鎖解開,這樣就可以生產了,生產后,將互斥鎖饑解開,提醒消費者,已解除阻塞,但此時,消費者所加的互斥鎖已經解開了,因此,涉及【pthread_cond_wait() 作用 3】,當 pthread_cond_wait()被喚醒后,重新為消費者回復原上鎖狀態,解除阻塞后,消費者開始消費,當消費結束后,解鎖,讓其他消費者搶鎖。
(3)解除阻塞,喚醒線程

int pthread_cond_signal(pthread_cond_t *cond); //喚醒 至少一個 阻塞在條件變量上的線程 int pthread_cond_broadcast(pthread_cond_t *cond); //喚醒 全部 阻塞在條件變量上的線程

(4)銷毀條件變量

int pthread_cond_destroy(pthread_cond_t *cond);

總結

以上是生活随笔為你收集整理的Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy)的全部內容,希望文章能夠幫你解決所遇到的問題。

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