我想在我的嵌入式實時項目中使用活動對象,如Herb Sutter描述的「優先使用活動對象而不是裸線 線程」所描述的 。我有軟實時要求和合理的處理器,所以我 不太擔心分配/取消分配消息 到主動幫助程序線程的運行時成本。雖然我堅持一個交叉編譯器 不支持C++ 0x特性的(和補充,我不能使用升壓),我相信我能 實施的一般模式,而無需使用TR1的功能。但是,在這裏我 卡住是如何正確實現未來從活動對象中獲取異步結果 回來?..會使用POSIX互斥和條件變量約POSIX消息隊列中 合理approach..how ?使用C++ 98的活動對象
回答
未來的基本上是圍繞一個緩衝的包裝,以保存結果,一個標誌,表示它已準備好,以保護對它的訪問一個互斥體,並等待一個條件變量。
如果你知道平臺的低級別的設備,你也許可以去優化它,但是這是基本的設置。
當然,緩衝區必須動態分配,所以它可以在活動對象線程和等待線程之間共享,並正確銷燬,所以使用類似ref_counted_ptr<future_data>
的東西。
獲取價值則是這樣的:
DataType future_data::get() {
pthread_mutex_lock(&mut);
while(!data_ready)
pthread_cond_wait(&cond,&mut);
DataType temp=get_buffer_value();
pthread_mutex_unlock(&mut);
return temp;
}
雖然很明顯,你需要添加錯誤檢查,並考慮例外。
感謝掃清事情了不少。假設ref_counted_ptr不必保證這種使用模式的線程安全性是否正確? – giantrobot 2012-02-23 23:40:42
不需要。您需要ref的原因是因爲設置結果的線程和讀取結果的線程都持有指向同一'future_data'對象的指針。您需要確保調整計數是線程安全的,以便只有一個線程試圖銷燬'future_data'對象,並且這是在正確的時間完成的。 – 2012-02-24 07:54:01
您可能想看看開放源碼QP/C++ state machine framework和我的書「C/C++中的實用UML狀態圖:嵌入式系統的事件驅動編程」。
的QP/C++框架是一個非常輕量級實現用於實時與活動對象分層狀態機(UML狀態圖)的建模行爲強烈支持嵌入式系統活動對象計算模型。特別是對於你的問題描述,框架已經被移植到POSIX線程中,其中每個活動對象在它自己的p線程中執行並且具有其自己的輕量級事件隊列,該隊列阻止私有條件變量。有關端口的更多信息,請參閱App Note "QP and POSIX"。 QP的完整代碼可從SourceForge.net獲取。
- 1. 活動圖對象流的使用
- 2. C++ 11移動語義與C++ 98
- 3. 使用PutSerializable傳遞活動對象
- 4. 活動記錄:使用db對象
- 5. 使用活動對象和BLOB
- 6. 活動的對象變量
- 7. Dropbox Djinni可以使用C++ 98
- 8. 使用C#動態方法的對象
- 9. C++ 98和線程
- 10. Xcode 5.1 C++ 98 char16_t
- 11. 清潔分配,並用一個對象的建築標準C++ 98/03
- 12. 獲取對象的活動引用
- 13. 不同對象的通用活動
- 14. 使對象移動C#
- 15. WPF和活動對象
- 16. 活動對象的返回值
- 17. 如何將線程類對象從活動傳遞到使用parcelable的活動
- 18. 使用滑塊移動對象openCV C++
- 19. 活動對象模式的.NET實現
- 20. 使用c的對象樹?
- 21. 從Swift使用C回調時的對象復活
- 22. Django:收集用戶,對象活動流
- 23. 重用活動和片段對象
- 24. 用JAXB編組活動對象?
- 25. 手動構建活動記錄對象
- 26. 如何發送主叫活動的對象被稱爲活動
- 27. 如何通過C++ 98中的特定字段在QList中查找對象?
- 28. 如何從給定的活動對象中觸發活動
- 29. 在C#中創建靈活的對象
- 30. Android NDK:保持活着的C++對象
不能使用升壓,但也許你可以看到他們是如何實現其未來的班,因爲他們將不得不依賴於並行線程在某一點...... – 2012-02-23 04:30:56