條件變量實現線程同步

(1) 什么是條件變量實現線程同步?
  假如我們的程序中有兩個線程,一個是生產者線程,另一個是消費者線程,生產者線程每隔一段時間把數據寫入到緩沖區buffer中,而消費者線程則每隔一段時間從buffer中取出數據,為了避免兩個線程讀寫混亂,我們讓生產線線程寫完后再通知消費者來讀數據,那么則可以用條件變量來實現線程的同步。

(2) 條件變量的兩個動作
  條件不滿足: 阻塞線程
  條件滿足: 通知阻塞的線程開始工作

(3) 條件變量的類型:

pthread_cond_t cond;

(4) 主要函數:
初始化一個條件變量(?第二參數一般為NULL)

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

銷毀一個條件變量

int pthread_cond_destroy(pthread_cond_t *cond);

阻塞等待一個條件變量

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

? ? ? ?阻塞線程
? ? ? ?將已經上鎖的mutex解鎖
? ? ? ?解除阻塞后會對mutex加鎖

限時等待一個條件變量

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

激活一個等待該條件的線程,存在多個等待線程時按入隊順序激活其中一個。

int pthread_cond_signal(pthread_cond_t *cond);

喚醒全部阻塞在條件變量上的線程

int pthread_cond_broadcast(pthread_cond_t *cond);

?

(5)注意事項

注意 1:
mutex 互斥鎖必須是普通鎖(PTHREAD_MUTEX_TIMED_NP)或者適應鎖(PTHREAD_MUTEX_ADAPTIVE_NP)。
在調用 pthread_cond_wait()前必須由本線程加鎖 pthread_mutex_lock()。
在更新條件等待隊列以前,mutex 保持鎖定狀態。
在線程掛起進入等待前解鎖。
注意 2:
在條件滿足從而離開 pthread_cond_wait() 之前,mutex 將被重新加鎖,以與進入
pthread_cond_wait()前的加鎖動作對應。
也就是說在做 pthread_cond_wait 之前,往往要用 pthread_mutex_lock 進行加鎖,而
調 pthread_cond_wait 函 數 會 將 鎖 解 開 , 然 后 將 線 程 掛 起 阻 塞 。 直 到 條 件 被
pthread_cond_signal 激發,該函數內部又會將鎖狀態恢復為鎖定狀態,
最后再用
pthread_mutex_unlock 進行解鎖。

注意 3:
pthread_cond_wait() 和 pthread_cond_timedwait()都被實現為取消點,也就是說如果
pthread_cond_wait()被取消,則退出阻塞,然后將鎖狀態恢復,然后當前線程就會終止。即
互斥鎖又恢復鎖定狀態,然而當前線程已經被取消掉,那么這個互斥鎖就不會被解開了,此
時鎖得不到釋放,就會造成死鎖,因而需要在線程退出前為其解鎖。

?

(5)示例

1.初始化條件變量和互斥鎖pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond, NULL);2.在線程中使用
(1)生產者線程pthread_mutex_lock(&mutex);// 使用互斥鎖保護共享數據對緩沖區buffer寫入操作pthread_cond_signal(&cond);// 通知阻塞的消費者線程,數據寫入完畢,可以解除阻塞了pthread_mutex_unlock(&mutex);(2)消費者線程pthread_mutex_lock(&mutex);  //調用pthread_cond_wait前一般都會搭配pthread_mutex_lockpthread_cond_wait(&cond, &mutex);    //等待生產者線程的通知從緩沖區buffer中讀出數據pthread_mutex_unlock(&mutex);        //解鎖3.銷毀條件變量和互斥鎖pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);

?

本文參考文章:

https://www.cnblogs.com/hesper/p/10738996.html

https://www.cnblogs.com/harlanc/p/8596211.html

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384505.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mjpg-streamer框架分析

mjpg-streamer程框架圖如下所示: 程序運行起來后,主進程根據傳入的參數設置的輸入輸出通道打開對應的輸入輸出動態鏈接庫,并依次調用以下函數 1、輸入---倉庫-----輸出(mjpg-streamer.h) (1)gl…

用strace工具跟蹤系統調用

Linux下可以用strace工具查看應用程序的系統調用。 strace -h 查看能調用的參數 1.strace -o xwatv.log xwatv //-o xwatv.log 是指定將跟蹤信息存放在xwatv.log中,xwatv是指要跟蹤的命令或應用程序 2.把生成的log文件拷貝回windows下進行分析 主要分析open…

linux字符驅動之概念介紹

一、字符驅動框架 問:應用程序open、read、write如何找到驅動程序的open、read、write函數? 答:應用程序的open、read、write是在C庫里面實現的,它里面通過swi val指令去觸發一個異常,這個異常就會進入到內核空間,在內…

linux字符驅動之自動創建設備節點

上一節中,我們是手工創建設備節點,大家肯定也會覺得這樣做太麻煩了。 上一節文章鏈接:https://blog.csdn.net/qq_37659294/article/details/104302700 問:能不能讓系統自動創建設備節點? 答:可以&#x…

linux字符驅動之點亮LED

上一節中,我們講解了如何自動創建設備節點,這一節我們在上一節的基礎上,實現點亮LED。 上一節文章鏈接:https://blog.csdn.net/qq_37659294/article/details/104308284 驅動里面能夠用很多種方法實現LED驅動,其中有本…

USB攝像頭視頻監控項目學習筆記

一個攝像頭監控應用程序的系統調用如下所示: /* open * VIDIOC_QUERYCAP 確定它是否視頻捕捉設備,支持哪種接口(streaming/read,write) * VIDIOC_ENUM_FMT 查詢支持哪種格式 * VIDIOC_S_FMT 設置攝像頭使用哪種格式 * VIDIOC_REQBUFS 申請buffer 對于 str…

圖片縮放算法

項目背景:博主之前做過一個攝像頭采集數據,然后在LCD上顯示視頻數據的項目,假如我們攝像頭采集的一幀數據的分辨率比我們的LCD的分辨率要大,那么LCD則無法顯示整個圖像,這時候我們就要把這么一幀圖片進行縮放&#xff…

數碼相框項目之顯示一張可放大、縮小、拖拽的圖片

之前我做過一個電子相框的項目,涉及到的重難點主要為:在LCD上放大、縮小、移動圖片。 首先我們得明白的一點是:無論是放大或縮小,實際上都是對原圖進行等比例的縮小,然后在LCD上面顯示,只不過縮小的程度不…

TCP協議-如何保證傳輸可靠性

TCP協議傳輸的特點主要就是面向字節流、傳輸可靠、面向連接。這篇博客,我們就重點討論一下TCP協議如何確保傳輸的可靠性的。 確保傳輸可靠性的方式 TCP協議保證數據傳輸可靠性的方式主要有: 校驗和序列號確認應答超時重傳連接管理流量控制擁塞控制 校…

TCP協議-握手與揮手

認識TCP協議 TCP全稱為“傳輸控制協議”,這是傳輸層的一個協議,對數據的傳輸進行一個詳細的控制。 特點: 面向字節流安全可靠面向連接 TCP協議段格式 源端口號與目的端口號:這里與UDP的一樣,每個數據都要知道從哪個…

ASOC注冊過程

一、什么是ASOC 在嵌入式系統里面的聲卡驅動為ASOC(ALSA System on Chip) ,它是在ALSA 驅動程序上封裝的一層,分為3大部分,Machine,Platform和Codec ,三部分的關系如下圖所示:其中Machine是指我…

ASOC調用過程

上一篇文章我們將了嵌入式系統注冊聲卡的過程:https://blog.csdn.net/qq_37659294/article/details/104748747 這篇文章我們以打開一個聲卡的播放節點為例,講解一下在APP調用open時,最終會如何調用到硬件相關的函數。 在上一篇文章最后我們說…

編寫聲卡驅動(框架)

在前面兩篇文章中,我們分別講了嵌入式Linux系統聲卡注冊的過程和調用的過程: https://blog.csdn.net/qq_37659294/article/details/104748747 https://blog.csdn.net/qq_37659294/article/details/104802868 講了那么多,我們最終的目的無非…

聲卡學習筆記

分享幾篇關于韋東山聲卡驅動的學習筆記,作者寫得非常詳細。 ALSA驅動框架:https://blog.csdn.net/qingkongyeyue/article/details/52328991 ASoC驅動框架:https://blog.csdn.net/qingkongyeyue/article/details/52349120 ASoC驅動重要結構…

路由器、交換機、集線器的區別

https://blog.csdn.net/weibo1230123/article/details/82779040

$PATH環境變量的作用

echo $PATH 顯示當前PATH環境變量,該變量的值由一系列以冒號分隔的目錄名組成,如:/usr/local/bin:/bin:/usr/bin。(冒號:是路徑分隔符) 在執行一個程序的時候如果沒有PATH的話,就需要寫出路徑名(絕對或者相對&#xf…

dmesg

https://blog.csdn.net/zm_21/article/details/31760569

進程上下文與中斷上下文的理解

一.什么是內核態和用戶態 內核態:在內核空間執行,通常是驅動程序,中斷相關程序,內核調度程序,內存管理及其操作程序。 用戶態:用戶程序運行空間。 二.什么是進程上下文與中斷上下文 1.進程上下文&#xf…

GDB調試教程:1小時玩轉Linux gdb命令

原文鏈接&#xff1a;http://c.biancheng.net/gdb/ GDB 入門教程 本教程以下面的代碼為例&#xff0c;在 Linux 系統下來講解 GBD 的調試流程&#xff1a; int main (void) {unsigned long long int n, sum;n 1;sum 0;while (n < 100){sum sum n;n n 1;}return 0; …

shell將命令執行的結果賦值給 變量

https://blog.csdn.net/lemontree1945/article/details/79126819/