在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳談Linux操作系統編程的條件變量

如意 ? 來源:良許Linux ? 作者:良許 ? 2020-09-27 15:23 ? 次閱讀

條件變量是用來等待線程而不是上鎖的,條件變量通常和互斥鎖一起使用。條件變量之所以要和互斥鎖一起使用,主要是因為互斥鎖的一個明顯的特點就是它只有兩種狀態:鎖定和非鎖定,而條件變量可以通過允許線程阻塞和等待另一個線程發送信號來彌補互斥鎖的不足,所以互斥鎖和條件變量通常一起使用。

當條件滿足的時候,線程通常解鎖并等待該條件發生變化,一旦另一個線程修改了環境變量,就會通知相應的環境變量喚醒一個或者多個被這個條件變量阻塞的線程。這些被喚醒的線程將重新上鎖,并測試條件是否滿足。一般來說條件變量被用于線程間的同步;當條件不滿足的時候,允許其中的一個執行流掛起和等待。

簡而言之,條件變量本身不是鎖,但它也可以造成線程阻塞,通常與互斥鎖配合使用,給多線程提供一個會合的場所。

條件變量的優點:

相較于mutex而言,條件變量可以減少競爭。如果僅僅是mutex,那么,不管共享資源里有沒數據,生產者及所有消費都全一窩蜂的去搶鎖,會造成資源的浪費。

如直接使用mutex,除了生產者、消費者之間要競爭互斥量以外,消費者之間也需要競爭互斥量,但如果匯聚(鏈表)中沒有數據,消費者之間競爭互斥鎖是無意義的。有了條件變量機制以后,只有生產者完成生產,才會引起消費者之間的競爭。提高了程序效率。

主要應用函數:

pthread_cond_init函數

pthread_cond_destroy函數

pthread_cond_wait函數

pthread_cond_timedwait函數

pthread_cond_signal函數

pthread_cond_broadcast函數

以上6 個函數的返回值都是:成功返回0, 失敗直接返回錯誤號。

pthread_cond_t類型:用于定義條件變量,比如:pthread_cond_t cond;

##pthread_cond_init函數

函數原型:

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

函數作用:初始化一個條件變量

參數說明:

cond:條件變量,調用時應傳&cond給該函數

attr:條件變量屬性,通常傳NULL,表示使用默認屬性

也可以使用靜態初始化的方法,初始化條件變量:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

##pthread_cond_destroy函數

函數原型:

int pthread_cond_destroy(pthread_cond_t *cond);

函數作用:銷毀一個條件變量

##pthread_cond_wait函數

函數原型:

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

函數作用:

阻塞等待一個條件變量。具體而言有以下三個作用:

阻塞等待條件變量cond(參1)滿足;

釋放已掌握的互斥鎖mutex(解鎖互斥量)相當于pthread_mutex_unlock(&mutex);

當被喚醒,pthread_cond_wait函數返回時,解除阻塞并重新申請獲取互斥鎖

其中1、2.兩步為一個原子操作。

##pthread_cond_timedwait函數

函數原型:

int pthread_cond_timedwait(pthread_cond_t restrict cond, pthread_mutex_t restrict mutex, const struct timespec *restrict abstime);

函數作用:限時等待一個條件變量

參數說明:

前兩個比較好理解,重點說明第三個參數。

這里有個struct timespec結構體,可以在man sem_timedwait中查看。結構體原型如下:

struct timespec { time_t tv_sec; / seconds / 秒 long tv_nsec; / nanosecondes/ 納秒 }

struct timespec定義的形參abstime是個絕對時間。注意,是絕對時間,不是相對時間。什么是絕對時間?2018年10月1日10:10:00,這就是一個絕對時間。什么是相對時間?給洗衣機定時30分鐘洗衣服,就是一個相對時間,也就是說從當時時間開始計算30分鐘,諸如此類。

如:time(NULL)返回的就是絕對時間。而alarm(1)是相對時間,相對當前時間定時1秒鐘。

adstime所相對的時間是相對于1970年1月1日00:00:00,也就是UNIX計時元年。

下面給出一個錯誤用法: struct timespec t = {1, 0}; pthread_cond_timedwait (&cond, &mutex, &t); 這種用法只能定時到 1970年1月1日 00:00:01秒,想必這個時間大家都還沒出生。

正確用法: time_t cur = time(NULL); 獲取當前時間。 struct timespec t; 定義timespec 結構體變量t t.tv_sec = cur+1; 定時1秒 pthread_cond_timedwait (&cond, &mutex, &t); 傳參

##pthread_cond_signal函數

函數原型:

int pthread_cond_signal(pthread_cond_t *cond);

函數作用: 喚醒至少一個阻塞在條件變量上的線程

##pthread_cond_broadcast函數

函數原型:

int pthread_cond_broadcast(pthread_cond_t *cond);

函數作用: 喚醒全部阻塞在條件變量上的線程

##生產者消費者條件變量模型

不管是什么語言,只要提到線程同步,一個典型的案例就是生產者消費者模型。在Linux環境下,借助條件變量來實現這一模型,是比較常見的一種方法。

假定有兩個線程,一個模擬生產者行為,一個模擬消費者行為。兩個線程同時操作一個共享資源(一般稱之為匯聚),生產向其中添加產品,消費者從中消費掉產品。

看如下示例,使用條件變量模擬生產者、消費者問題:

#include 《stdio.h》 #include 《stdlib.h》#include 《unistd.h》#include 《pthread.h》typedef struct msg { struct msg *next; int num;}msg_t;msg_t *head = NULL;msg_t *mp = NULL;/* 靜態初始化 一個條件變量 和 一個互斥量*/pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;void *th_producer(void *arg) { while (1) { mp = malloc(sizeof(msg_t)); mp-》num = rand() % 1000; //模擬生產一個產品 printf(“--- produce: %d --------\n”, mp-》num); pthread_mutex_lock(&mutex); mp-》next = head; head = mp; pthread_mutex_unlock(&mutex); pthread_cond_signal(&has_product); //喚醒線程去消費產品 sleep(rand() % 5); } return NULL; }void *th_consumer(void *arg) { while (1) { pthread_mutex_lock(&mutex); while (head == NULL) { //如果鏈表里沒有產品,就沒有搶鎖的必要,一直阻塞等待 pthread_cond_wait(&has_product, &mutex); } mp = head; head = mp-》next; //模擬消費掉一個產品 pthread_mutex_unlock(&mutex); printf(“========= consume: %d ======\n”, mp-》num); free(mp); mp = NULL; sleep(rand() % 5); } return NULL; }int main(){ pthread_t pid, cid; srand(time(NULL)); pthread_create(&pid, NULL, th_producer, NULL); pthread_create(&cid, NULL, th_consumer, NULL); pthread_join(pid, NULL); pthread_join(cid, NULL); return 0; }

運行結果:

詳談Linux操作系統編程的條件變量


責編AJX

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11351

    瀏覽量

    210497
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28475
  • 操作環境
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7069
收藏 人收藏

    評論

    相關推薦

    Linux系統編程

    Linux系統編程
    發表于 03-03 10:26

    Linux操作系統安裝與使用

    嵌入式網絡編程+嵌入式Linux系統一、Linux操作系統安裝與使用(命令)二、Linux開發工
    發表于 11-05 08:25

    為何將Linux操作系統劃分為用戶和內核

    linux_C網絡編程概述嵌入式網絡編程==嵌入式Linux_C系統編程(文件、進程、進程間通信、多線程、網絡、大并發網絡服務器、數據庫、s
    發表于 12-15 08:35

    Linux操作系統安裝與使用

    嵌入式網絡編程+嵌入式Linux系統Linux操作系統安裝與使用(命令)Linux開發工具(gc
    發表于 12-22 07:47

    嵌入式Linux C系統編程相關資料下載

    D3.31、嵌入式網絡編程==嵌入式Linux C系統編程(文件、進程、進程間通信、多線程、網絡、大并發網絡服務器、數據庫、shell編程)2、嵌入式C開發VS嵌入式
    發表于 12-22 07:44

    Linux操作系統安裝與使用方法

    嵌入式網絡編程+嵌入式Linux系統Linux操作系統安裝與使用(命令)Linux開發工具(gc
    發表于 12-23 06:57

    什么是Linux系統編程

    什么是Linux系統編程Linux系統編程也叫Linux下的高級編程,是介于應用層和驅動層之間
    發表于 12-23 07:30

    是否可以為linux操作系統編譯并在基于debian的rasperry操作系統中運行?

    STM32CubeProgrammer 有一個 C++ API,允許創建使用 qt creator 編譯的程序。是否可以為 linux 操作系統編譯并在基于 debian 的 rasperry 操作系統中運行?
    發表于 12-06 06:01

    Linux操作系統

    linux的教學內容1 、Linux概述 2 、Linux操作系統安裝3、 Linux的內核 4 、Li
    發表于 04-10 16:54 ?0次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統</b>

    基于Linux操作系統下C語言編程入門

    基于Linux操作系統下C語言編程入門
    發表于 10-27 15:36 ?11次下載
    基于<b class='flag-5'>Linux</b><b class='flag-5'>操作系統</b>下C語言<b class='flag-5'>編程</b>入門

    linux系統編程_中文版

    linux系統編程_中文版
    發表于 10-29 10:17 ?0次下載
    <b class='flag-5'>linux</b><b class='flag-5'>系統編程</b>_中文版

    Linux操作系統下C語言編程入門.pdf

    Linux操作系統下C語言編程入門
    發表于 05-17 10:08 ?96次下載

    詳談Linux操作系統編程的互斥量mutex

    前文提到,系統中如果存在資源共享,線程間存在競爭,并且沒有合理的同步機制的話,會出現數據混亂的現象。為了實現同步機制,Linux中提供了多種方式,其中一種方式為互斥鎖mutex(也稱之為互斥量)。
    的頭像 發表于 09-28 15:09 ?2554次閱讀
    <b class='flag-5'>詳談</b><b class='flag-5'>Linux</b><b class='flag-5'>操作系統編程</b>的互斥量mutex

    為什么我們要掌握Linux系統編程

    為什么我們要掌握Linux系統編程
    的頭像 發表于 05-17 10:00 ?921次閱讀

    Linux 系統編程的難點是什么

    對于有一定 Linux 開發基礎希望進階學習 Linux 系統編程的開發人員來說,其難點在于,Linux 所囊括的技術點繁雜,往往不知從何下手。
    發表于 06-28 12:54 ?674次閱讀
    主站蜘蛛池模板: 日韩一级片在线免费观看 | www四虎影院 | 福利视频欧美 | 中文字幕一区二区三区四区五区人 | 伊人黄| 亚洲免费不卡 | 国产精品福利视频手机免费观看 | 黄色网一级片 | 27pao强力打造高清免费高 | 蜜桃五月天 | 国产免费福利网站 | 欧美日本俄罗斯一级毛片 | 啪视频免费 | 日日干天天爽 | 美女视频永久黄网站免费观看国产 | 国产精品久久久久久久久久影院 | 亚洲视频入口 | 日本免费黄色小视频 | 亚州三级视频 | 四虎影视在线影院4hutv | 美女扒开尿口给男的桶个爽 | av天天看| 色天使亚洲综合在线观看 | 天天操天天爽天天射 | 91视频啪啪 | 国产免费播放一区二区三区 | 日日夜夜天天久久 | 国内真实实拍伦视频在线观看 | eeuss影院www影院夜场 | h网站国产 | 国产女人伦码一区二区三区不卡 | 性做久久久久久久久 | 在线视频亚洲色图 | 久久国产美女 | 午夜看片 | 爽爽爽爽爽爽a成人免费视频 | 国产一级片免费看 | 在线毛片网站 | 日韩色网 | 亚洲成综合人影院在院播放 | 午夜丁香影院 |