OpenRTMFP/Cumulus Primer(19)獨立使用CumulusLib時的執行緒安全Bug
OpenRTMFP/Cumulus Primer(19)獨立使用CumulusLib時的執行緒安全Bug
- 作者:柳大·Poechant(鍾超)
- 郵箱:zhongchao.ustc#gmail.com(# -> @)
- 部落格:Blog.CSDN.net/Poechant
- 日期:June 7nd, 2012
OpenRTMFP/Cumulus 提供了 CumulusLib 可以供其他 RTMFP 應用使用,而不侷限於 CumulusServer。
一般來說,Thread A 會準備好要 push 的訊息,然後 Thread A 向訊息佇列 push 訊息。
但是 CumulusLib 中實現的,是 Thread A 向訊息佇列 push 訊息,然後根據這個訊息在佇列中的指標,再向訊息內填寫欄位。並期望如下:
由於在 CumulusServer 中,一個 Client 只在一個執行緒內被操作,相應的 FlowWriter 也不會出現跨執行緒的問題。但是如果單獨使用 CumulusLib,如果出現執行緒通訊,並且共享 FlowWriter 的話,就會共享訊息佇列,此時可能出現這種情況。
這就導致了很嚴重的錯誤,會使得程式崩潰。修正的方式,可以是將訊息完全準備好之後,再放入佇列,如下:
/*
* author: michael
* date: June 6th, 2012
* type: add
*/
MessageBuffered* FlowWriter::createAMFMessage(const std::string& name)
// signature.empty() means that we are on the flowWriter of FlowNull
if (!(_closed || signature.empty() || _band.failed())) {
MessageBuffered* pMessage = new MessageBuffered();
MessageBuffered& message(*pMessage);
writeResponseHeader(message.rawWriter,name,0);
return pMessage;
}
MessageBuffered& message(_MessageNull);
writeResponseHeader(message.rawWriter,name,0);
return NULL;
}
然後再呼叫時最後再增加 push 操作:
/*
* author: michael
* date: June 6th, 2012
* type: add
*/
void FlowWriter::pushAMFMessage(MessageBuffered* pMessage) {
if (pMessage != NULL) {
_messages.push_back(pMessage);
}
}
這樣就使得訊息的資料被寫完了,才被放入佇列中,如下:
不過如果考慮執行緒安全,多個執行緒對同一個訊息佇列進行操作時,就要加鎖:
/*
* author: michael
* date: June 6th, 2012
* type: add
*/
void FlowWriter::pushAMFMessage(MessageBuffered* pMessage) {
if (pMessage != NULL) {
Poco::Mutex::ScopedLock lock(msgQueueMutex);
_messages.push_back(pMessage);
}
}
這樣就基本解決了這個執行緒安全問題。
另外,使用 CumulusLib 要遵循 GPL 協議,一定不要忘記。
-
轉載請註明來自柳大·Poechant(鍾超)的CSDN部落格:Blog.CSDN.net/Poechant
-
相關文章
- OpenRTMFP/Cumulus Primer(22)執行緒邏輯分析之一:RTMFPServer執行緒的啟動和等待執行緒Server
- OpenRTMFP/Cumulus Primer(23)執行緒邏輯分析之二:RTMFPManager對RTMFPServer的影響執行緒Server
- OpenRTMFP/Cumulus Primer(4)CumulusServer啟動流程分析Server
- OpenRTMFP/Cumulus Primer(16)AMF解析之AMFReader
- OpenRTMFP/Cumulus Primer(5)CumulusServer啟動流程分析(續)Server
- OpenRTMFP/Cumulus Primer(14)AMF解析之PacketReader/Writer
- OpenRTMFP/Cumulus Primer(8)CumulusServer主程式主迴圈分析Server
- OpenRTMFP/Cumulus Primer(6)CumulusServer啟動流程分析(續2)Server
- OpenRTMFP/Cumulus Primer(18)AMF解析之AMFReader(續2)
- OpenRTMFP/Cumulus Primer(17)AMF解析之AMFReader(續1)
- OpenRTMFP/Cumulus Primer(9)AMF解析之BinaryReader/Writer
- OpenRTMFP/Cumulus Primer(7)CumulusServer啟動流程分析(續3)Server
- OpenRTMFP/Cumulus Primer(5)CumulusServer啟動流程分析(續1)Server
- OpenRTMFP/Cumulus Primer(1)入門介紹與部署CumulusServerServer
- OpenRTMFP/Cumulus Primer(7)CumulusServer 啟動流程分析(續3)Server
- Java中使用ThreadPoolExecutor並行執行獨立的單執行緒任務Javathread並行執行緒
- OpenRTMFP/Cumulus Primer(15)AMF解析之資料型別定義資料型別
- OpenRTMFP/Cumulus Primer(9)AMF 處理方式解析——BinaryReader/Writer
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- OpenRTMFP/Cumulus Primer(13)IO管理之區域性記憶體片記憶體
- OpenRTMFP/Cumulus Primer(2)用Lua編寫HelloWorld應用擴充套件CumulusServer套件Server
- web-worker 獨立執行緒,效能最佳化Web執行緒
- OpenRTMFP/Cumulus Primer(21)經由伺服器的釋出/訂閱流程的關鍵點伺服器
- .net打獨立執行環境遇到無法trim遇到的bug
- WPF打包獨立執行的程式
- Java多執行緒/併發14、保持執行緒間的資料獨立:ConcurrentHashMap應用Java執行緒HashMap
- Java多執行緒/併發13、保持執行緒間的資料獨立: Collections.synchronizedMap應用Java執行緒synchronized
- 什麼時候執行緒不安全?怎樣做到執行緒安全?怎麼擴充套件執行緒安全的類?執行緒套件
- 【Java多執行緒】執行緒安全的集合Java執行緒
- MySQL記憶體執行緒獨享使用的方法MySql記憶體執行緒
- 執行緒3--執行緒安全執行緒
- 執行緒安全和執行緒不安全理解執行緒
- 執行緒安全執行緒
- PHP的執行緒安全與非執行緒安全版本的區別PHP執行緒
- 執行緒安全使用 HashMap 的四種技巧執行緒HashMap
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- iOS多執行緒之執行緒安全iOS執行緒