- 概述
- 緒言
- 問(wèn)題
- 解決方案
線(xiàn)程池
為什么使用線(xiàn)程池
Windows*線(xiàn)程池服務(wù)
Windows線(xiàn)程池服務(wù)特性
處理同步函數
向應用程序發(fā)送通知
平臺無(wú)關(guān)性
- 應用實(shí)例
應用場(chǎng)景
應用程序初始化
調用同步函數
異步方式調用同步函數
應用程序標準運行時(shí)事件循環(huán)
- 結論
■ 概 述
本應用手冊描述了在Windows操作系統上以異步方式調用Dialogic® Dialogic®同步函數的解決方案。首先講解線(xiàn)程及線(xiàn)程池,然后介紹一個(gè)會(huì )議應用的解決方案。
■ 緒 言
本文檔介紹的方案普遍適用于任何一種耗時(shí)的,在完成之前阻塞其調用線(xiàn)程的函數。該方案在多線(xiàn)程的應用環(huán)境里利用Dialogic的標準運行時(shí)庫(SRL)進(jìn)行事件管理。你可以使用任何事件管理機制來(lái)替代SRL,但是SRL提供了一個(gè)標準的方法來(lái)管理Dialogic?系統中的事件。
想了解更多關(guān)于SRL的信息,請訪(fǎng)問(wèn):
http://www.Dialogic.com/
請注意在試用本應用手冊里介紹的方案之前,建議讀者對同步函數的多線(xiàn)程安全性進(jìn)行測試。本文所述方案僅適用于線(xiàn)程安全的同步函數。
■ 問(wèn) 題
絕大多數Dialogic Dialogic函數允許調用者選擇一種函數調用方式,分別是EV_SYNC(同步方式)和EV_ASYNC(異步方式)。但是有些函數只提供一種同步接口。同步函數在執行過(guò)程中會(huì )阻塞調用它的線(xiàn)程或整個(gè)單線(xiàn)程的應用程序,直到函數返回。這種局限性成為了應用開(kāi)發(fā)者非常關(guān)心的問(wèn)題,特別是在高密度的系統中,某些同步函數非常耗時(shí)。這種耗時(shí)的函數限制了應用程序繼續處理其它的邏輯,而只能等待同步函數返回。

■ 解決方案
使用多線(xiàn)程可以異步的執行同步函數。創(chuàng )建一個(gè)新的線(xiàn)程或使用一個(gè)已經(jīng)創(chuàng )建的線(xiàn)程作為工作線(xiàn)程,用來(lái)調用耗時(shí)的同步函數并等待其執行和返回,而應用線(xiàn)程可以繼續處理后面的邏輯。當同步函數返回時(shí),工作線(xiàn)程發(fā)布一個(gè)SRL事件(稍后說(shuō)明)給應用線(xiàn)程,根據同步函數的返回值傳遞相應的返回碼。
一種方法是預先創(chuàng )建一個(gè)工作線(xiàn)程池等待為主應用程序服務(wù)。這樣可以避免創(chuàng )建和結束動(dòng)態(tài)線(xiàn)程的負荷。此時(shí),線(xiàn)程池里的某個(gè)線(xiàn)程可能專(zhuān)門(mén)用于為池里的其它可用線(xiàn)程分配工作。
下面的圖表闡述了這種解決方案的原理和好處。
線(xiàn)程池
本節介紹如何利用線(xiàn)程實(shí)現本篇應用手冊中建議的解決方案。
為什么使用線(xiàn)程池
如前所述,使用額外的線(xiàn)程可以讓主應用線(xiàn)程不必去等待同步函數的執行。也就是說(shuō),應用程序可以繼續處理它的邏輯,而不會(huì )被執行中的同步函數阻塞。
但是如果額外的線(xiàn)程是在要調用同步函數的時(shí)候創(chuàng )建的,應用程序就要花費操作系統所需要的時(shí)間去創(chuàng )建這個(gè)線(xiàn)程。更好的解決方法是在應用程序初始化時(shí)預先創(chuàng )建一組工作線(xiàn)程,當應用程序需要時(shí)可以利用它們調用任何的同步函數。這個(gè)池里的工作線(xiàn)程需要由"某個(gè)人"來(lái)管理,為它們分派工作并保持負載平衡。因此在一個(gè)有"n"個(gè)工作線(xiàn)程的池里,你可以指定第一個(gè)線(xiàn)程作為主線(xiàn)程或者控制線(xiàn)程,其它?quot;n-1"個(gè)線(xiàn)程作為用來(lái)調用同步函數的工作線(xiàn)程。
Windows*線(xiàn)程池服務(wù)
Windows*本身就提供了由操作系統來(lái)進(jìn)行管理的線(xiàn)程池技術(shù)。它根據應用程序的需要動(dòng)態(tài)的創(chuàng )建和刪除線(xiàn)程。可創(chuàng )建的線(xiàn)程數僅受到系統內存的限制。
應用程序通過(guò)Windows的函數QueueUserWorkItem來(lái)使用線(xiàn)程池庫。當應用程序第一次調用這個(gè)函數時(shí),Windows會(huì )創(chuàng )建線(xiàn)程池。池里至少會(huì )有一個(gè)線(xiàn)程被用來(lái)監測其它的線(xiàn)程,并按照應用程序的需要為它們分配工作任務(wù)。
預了解更多詳情,請訪(fǎng)問(wèn)
,查找QueueUserWorkItem。
Windows線(xiàn)程池服務(wù)特性
Microsoft Visual Studio* 6.0版本提供的"winbase.h"里沒(méi)有包含函數QueueUserWorkItem的定義。開(kāi)發(fā)者需要按如下所示手工定義這個(gè)函數,或者在包含Visual
Studio頭文件之前包含Windows SDK版本的"winbase.h"。
處理同步函數
任何同步函數要通過(guò)異步方式調用要開(kāi)發(fā)一個(gè)開(kāi)起來(lái)類(lèi)似的函數, 而且和同步函數有相同的參數。
同步函數:
異步方式的同步函數:
按如下所示定義一個(gè)結構用來(lái)封裝函數的參數并傳遞給線(xiàn)程池。如果任何一個(gè)形式參數是指針類(lèi)型的變量,要確保同步函數在工作線(xiàn)程中執行時(shí)該指針是有效的。
應用程序按如下所示調用Dialogic函數:
THREAD_ASYNC_foo是回調函數,會(huì )被Windows線(xiàn)程池服務(wù)選擇的工作線(xiàn)程調用。
回調函數的實(shí)現方法:
ASYNC_EVENT_FOO是同步函數foo完成時(shí)發(fā)布給應用程序的SRL用戶(hù)事件。實(shí)際上foo確實(shí)是以同步方式調用的,但是現在僅有線(xiàn)程池中被選中的線(xiàn)程用來(lái)等待該函數完成,而應用程序則可以不受限制的繼續處理它的邏輯。
形式參數被封裝在一個(gè)結構里,其占用內存是在程序片斷里動(dòng)態(tài)分配和釋放的。在高密度系統中,可以使用緩沖池來(lái)預先分配內存從而避免動(dòng)態(tài)分配和釋放內存的負荷。
向應用程序發(fā)送通知
同步函數完成時(shí),工作線(xiàn)程通過(guò)SRL提供的事件發(fā)布技術(shù)通知應用程序。其它的事件管理方法也可以用來(lái)達到這一目的。
SRL主要的功能是提供事件管理的通用接口和所有Dialogic設備的通用功能。SRL負責集中的分發(fā)所有Dialogic設備上產(chǎn)生的事件。通過(guò)SRL,能夠以一種標準的方式處理事件。
同步函數完成后,THREAD_ASYNC_foo回調函數使用SRL函數sr_putevt向應用程序發(fā)布一個(gè)預定義的事件。
應用程序接著(zhù)使用某個(gè)SRL等待函數來(lái)等待SRL事件,例如如下所示的sr_waitevt,該函數在指定的時(shí)間段內等待任何事件。
函數ProcessEvents為應用程序管理事件。所有在應用程序的SRL事件循環(huán)中接收到的事件都是在這個(gè)函數里處理的。該函數僅對接收到的事件進(jìn)行分析和執行事件相關(guān)的處理。
平臺無(wú)關(guān)性
本應用手冊介紹的解決方案是在Windows上實(shí)現的。你可以開(kāi)發(fā)一個(gè)平臺無(wú)關(guān)的線(xiàn)程池庫,這樣應用程序就不用關(guān)心底層是什么操作系統了。如果是Windows,這個(gè)庫可以利用Windows自帶的線(xiàn)程池服務(wù);如果是其它的操作系統,可能要自行實(shí)現線(xiàn)程池技術(shù)。
■ 應用實(shí)例
本應用手冊介紹的解決方案是以一個(gè)會(huì )議應用為實(shí)例的。這個(gè)應用程序有兩個(gè)參數。
模式: 0 = 同步; 1 = 異步
會(huì )議方數
應用場(chǎng)景
應用程序創(chuàng )建一個(gè)用戶(hù)提供方數的會(huì )議。第一方播放一個(gè)文件,其余各方錄制該文件。應用程序運行在異步模式演示了異步調用方式。函數dcb_estconf和dcb_addtoconf例證了這種方案。這兩個(gè)函數是Dialogic
R4 API的一部分,它們只能提供同步的調用模式。但是這個(gè)應用程序演示了一個(gè)開(kāi)發(fā)者如何用異步方式來(lái)調用這些函數。
應用程序初始化
調用同步函數
每個(gè)同步函數foo的異步形勢可能是ASYNC_foo。兩種函數應該有相同形勢的參數。
異步方式調用時(shí),返回碼僅表示這項工作已被成功的傳遞給工作線(xiàn)程。實(shí)際的錯誤返回碼將在同步函數完成時(shí)由工作線(xiàn)程發(fā)送到應用程序的事件循環(huán)里。
異步方式調用同步函數
為了完成讓工作線(xiàn)程調用同步函數的任務(wù),異步形勢的函數必須把函數參數封裝在一個(gè)結構里,為這個(gè)結構分配內存,然后使用Windows
API QueueUserWorkItem把一項用戶(hù)工作發(fā)送給線(xiàn)程池庫。
應用程序標準運行時(shí)事件循環(huán)
下面這段代碼提供了本應用手冊所討論的會(huì )議應用的事件管理實(shí)例。
■ 結 論
在一個(gè)簡(jiǎn)單的32方會(huì )議應用實(shí)例的測試運行中,同步模式調用阻塞了應用程序達3545毫秒。與此相反,異步模式僅僅阻塞了應用程序421毫秒。換言之,本應用手冊介紹的方案幫助應用程序以相當于同步方式12%的時(shí)間處理了同步函數。在大多數應用中,這段寶貴的時(shí)間可以用來(lái)處理其它的應用邏輯。該測試系統的規范如下:
- 系統版本: Dialogic Dialogic SR 5.1.1 FP1 for Windows
- 操作系統: Windows 2000 SP 3
- 處理器速度: 500 MHz
- 內存: 128 MB
- Dialogic Dialogic板卡: DM/V1200A-4E1, DM/V1200-4E1
與了解更多詳情,請訪(fǎng)問(wèn)Dialogic網(wǎng)站http://www.Dialogic.com/.
[ 全文英文版
]
|