《OSG3 4 0》Part2 OSG中的多執行緒

2021-08-11 03:32:59 字數 2663 閱讀 7531

* osg中的多執行緒*

osg中的多執行緒是通過openthreads實現的。主要有七大類:

thread()

預設建構函式

static int yieldcurrentthread

要求當前執行緒出讓cpu控制權,交給其他正在等待的執行緒

int start()

啟動執行緒。此時將自動開始執行執行緒的run()函式

int startthread()

啟動執行緒。此時將自動開始執行執行緒的run()函式

int cancel()

虛函式,用於中止執行緒的執行

bool isrunning()

執行緒執行的主函式,在這個函式中可以迴圈執行一段執行緒功能**->

void run()=0

->但一定要用yieldcurrentthread()出讓cpu控制權

int setprocessoraffinity(unsigned int cpunumber)

對於多處理器的系統,設定執行緒所在的cpu位置

互斥體介面類——可以有效地避免各個執行緒對同一資源的相互競爭—某個執行緒欲操作某一共享資源時,使用互斥體成員的lock()函式加鎖,操作完成猴再使用unlock()函式解鎖。乙個執行緒中可以有多個mutex成員,用於在不同的地點或情形下為共享區域加鎖;但是一定要在適當的執行緒的共享資料無法再訪問。

* openthread::mutex類*

mutex()

預設建構函式

int lock()

互斥體加鎖/解鎖

int unlock()

互斥體加鎖/解鎖

條件量介面類。它依賴於mutex互斥體,互斥體加鎖時阻塞所在的執行緒,解鎖或者超過時限則釋放此執行緒,允許其繼續執行。

簡單來說就是使同一程序的多個執行緒可以協調工作,例如他猛都在指定的執行點等待對方,直到全員到齊之後才開始同步執行。

即強制乙個執行緒在某個執行點上等待,直到滿足繼續執行的條件為止,例如其他的執行緒達到同一執行點、某個變數初始化完成等:可以通過條件變數來設定各種條件。

openthreas::condition

condition()

預設建構函式

int wait(mutex* mutex)

設定作為條件量的互斥體,並強制執行緒等待此條件滿足

int singal()

喚醒乙個執行緒,或者喚醒所有被阻塞的執行緒

int broadcast()

喚醒乙個執行緒,或者喚醒所有被阻塞的執行緒

即阻塞器類,顧名思義,這個類的作用就是阻塞執行緒的執行,即使用block()阻塞執行它的執行緒(注意,不一定是定義它的thread執行緒,而是當前執行了block函式的執行緒,包括系統主程序),並使用release()釋放之前被阻塞的執行緒。

openthreas::block類

block()

預設建構函式

bool block()

阻塞當前的執行緒

void release()

釋放當前的執行緒

即計數阻塞器類。它與阻塞器類的使用方法基本相同:block()阻塞執行緒,release()釋放執行緒;不過除此之外,blockcount的建構函式還可以設定乙個阻塞計數值。計數的作用是:每當阻塞器物件的complete()函式被執行一次,計數器就減1,直到減到零釋放被阻塞的執行緒。

openthreas::blockcount類

blockcount(unsigned int count)

建構函式,其中定義了初始計數值

bool block()

直接阻塞當前的執行緒

void release()

直接釋放當前的執行緒

void complete()

完成一次計數器減1的操作,減到零時釋放被阻塞的執行緒

即執行緒柵欄類。這是乙個對於執行緒同步來說頗為重要的阻塞器介面,其建構函式與blockcount類似,可以設定乙個整數值,我們可以把這個值理解為柵欄的「強度」。每個執行了barrier::block()函式的執行緒都將被阻塞;當被阻塞在柵欄處的執行緒達到指定的數目時,就好比柵欄無法無法支撐那麼大的強度一樣,柵欄被沖開,所有的執行緒將被釋放。重要的是,這些執行緒幾乎是同時釋放的,也就保證了執行緒執行的同步性。

openthreas::barrier類

barrier(int threads)

建構函式,其中定義了柵欄可以負荷的執行緒數

bool block(unsigned int)

阻塞當前的執行緒,如果超過了柵欄的強度(可以在這裡重新設定強度),則自動釋放所有的執行緒

scopelock模板類是與mutex配合出現的,在其作用區域內將對共享資源進行加鎖,作用域之外則自動解鎖。**格式如下:

在大括號範圍內,程序的共享資源被當前程序鎖定,超過範圍則自動解鎖。

OSG學習筆記15 OSG中對事件的處理

看了王銳大大的書,我感覺osg中對事件的處理主要是由以下幾塊組成的 1 事件介面卡 guieventadapter 這個類是作為系統互動事件和osg互動事件的適配介面。這一句話還不是很理解。原始碼文件裡對於這個類的定義是 事件類,儲存鍵盤 滑鼠和視窗事件。公有型別包括 這些型別都是列舉型別,每個型別...

OSG中圓錐的使用

以前寫的一些測試程式,整理一下,看什麼時候需要用的時候能把功能盡快新增到工程中。圓錐的使用,包括圓錐大小的定義,圓錐的顏色修改,圓錐的透明效果,圓錐的線框模型,圓錐的旋轉,圓錐的中心點。如下 pragma comment lib,osg.lib pragma comment lib,osgdb.li...

OSG中LOD的使用

lod是level of detail 的縮寫,lod允許程式根據攝像機與物體的距離,來決定使用哪個模型。使用lod是為了兼顧程式的執行效率與物體顯示的精細程度。當物體離攝像機很遠的時候,物體看起來就是乙個點,這時候你使用再精細的模型,最終螢幕上成像也是乙個點。而你用的模型越精細,計算機內部需要的計...