WebRTC原始碼分析之事件 Event

2021-10-22 04:07:42 字數 4633 閱讀 8580

event原始碼分析

小結event類實現了事件的等待和觸發,通過介面

wait()函式可以實現執行緒的阻塞,而

set()函式可以啟用阻塞的執行緒。

event類在webrtc的很多位置都有使用,理解了event類才能更好的閱讀其他webrtc原始碼。

event使用示例

工程示例工程:提取碼:cenz

示例-一直阻塞

在呼叫wait()函式時將引數設定為-1,表示執行緒一直阻塞,直到呼叫set()函式才能啟用阻塞的執行緒。

示例-有超時的阻塞

#include

#include

#include

#include

#include

"event.h"

using

namespace std;

using

namespace rtc;

event e

(false

,false);

void

*mythread

(void

* arg)

intmain()

/***執行緒*/

呼叫wait()函式時,若引數不是-1,則執行緒阻塞指定的時間後,會自動的被喚醒。

示例-提前結束超時阻塞

#include

#include

#include

#include

#include

#include

"event.h"

using

namespace std;

using

namespace rtc;

event e

(false

,false);

void

*mythread

(void

* arg)

intmain()

/*5s後主動喚醒被阻塞的執行緒*/

使用具有超時的wait()函式,可以主動呼叫set()提前將執行緒喚醒。

event原始碼分析

實現原理

在linux平台上,event通過系統提供的互斥鎖條件變數實現的。

event的宣告

event類所在檔案的位置:src\rtc_base\event.h event.cc

class

event

;

event類的主要通過互斥鎖(event_mutex_)和條件變數(event_cond_)實現執行緒的阻塞和啟用。

event_status_就是條件變數等待的條件,其值為true時表示條件成立,執行緒被喚醒。

構造器和析構器

event::

event()

:event

(false

,false

)event::

event

(bool manual_reset,

bool initially_signaled)

:is_manual_reset_

(manual_reset)

,event_status_

(initially_signaled)

/*在析構時,需要析構掉互斥鎖和條件變數。*/

event::

~event()

在構造器中主要是初始化互斥鎖條件變數,在析構器中主要是銷毀這個兩者。

時間轉換函式

timespec gettimespec

(const

int milliseconds_from_now)

return ts;

}

gettimespec()函式用於計算milliseconds_from_now毫秒後的時間是多少。這個函式主要用於計算事件被啟用的時間的多少。

阻塞事件

bool event::

wait

(const

int milliseconds)

if(milliseconds == kforever && error == etimedout)

}/*is_manual_reset_為false,表示自動重置。*/

if(error ==0&&

!is_manual_reset_)

event_status_ =

false

;pthread_mutex_unlock

(&event_mutex_)

;return

(error ==0)

;}

根據wait()函式引數的不同,分成兩種情況:milliseconds=-1和milliseconds=正整數。

milliseconds=-1時,表示執行緒會一直阻塞,直到呼叫set()函式才能將執行緒喚醒。執行過程分析如下:因為milliseconds=-1,由milliseconds == kforever ? 3000 : milliseconds知結果是3000毫秒,執行到pthread_cond_timedwait()函式時,執行緒先在這個函式上阻塞3秒鐘。阻塞3秒後,從這個函式退出,同時返回值是etimeout,從而跳出當前所在的while迴圈。因為milliseconds=kforever並且error=etimeout,所以執行緒再次被阻塞在pthread_cond_wait()函式上。

當執行緒被阻塞在pthread_cond_timedwait()函式時,呼叫了set()函式,event_status_被設定為true,執行緒被喚醒,同時返回值是0,則跳出當前while迴圈。因為error的值是0,所以不會進入下面while迴圈,結束wait()函式。

當執行緒被阻塞在pthread_cond_wait()函式時,呼叫了set()函式,event_status_被設定為true,執行緒被喚醒,跳出當前while迴圈,結束wait()函式。

喚醒事件

void event::

set(

)

set()函式將喚醒阻塞的執行緒。pthread_cond_broadcast()才真正的啟用阻塞的執行緒,修改event_status_為true,是避免執行緒再次被阻塞,修改這個值,說明條件滿足了,執行緒不需要再被阻塞了。

重置事件

void event::

reset()

呼叫reset()函式,將event_status_手動置為false。

在手動重置事件中,使用event的方式是:wait() —— set() —— reset() —— wait() —— set() —— reset() …

在自動重置事件中,使用使用event的方式是:wait() —— set() —— wait() —— set() …省去了呼叫reset()。

在初始化event類物件時,若通過傳參的方式將event_status_置為false,則在wait()函式最後會主動的把event_status_置為false,避免了手動呼叫reset()。

在無參構造event物件時,會預設的把event_status_置為false。

小結參考:webrtc base模組event事件的實現

Yarn原始碼分析之事件模型

上篇 yarn原始碼分析之集群啟動流程 我們介紹了yarn的啟動過程,捎帶介紹了asyncdispatcher,但感覺有必要單獨詳細分析下 原始碼版本 hadoop2.7.1 為了更好的應對併發,yarn採用了基於事件的非同步模型。所謂基於事件的模型,就是通過事件佇列快取住各種事件,然後通過事件分發...

WebRTC原始碼分析

注 webrtc的版本是m75 已完成 正在寫作中 webrtc原始碼分析之多路訊號分離器 physicalsocketserver webrtc原始碼分析之訊息佇列 messagequeue webrtc原始碼分析之執行緒 thread webrtc原始碼分析之跨執行緒同步執行 methodcal...

NHiberante原始碼分析之 事務

對資料庫的操作是少不了事務處理的,事務能保整資料完整性和有效性。在nh中,使用transaction物件對.net的事務物件 實現了idbtransaction介面的物件 進行了包裝。在nh中,乙個典型的事務處理是這樣的 見isession.cs的注釋 isession sess factory.o...