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...