2012-02-23 18 views
0

我想在我的嵌入式實時項目中使用活動對象,如Herb Sutter描述的「優先使用活動對象而不是裸線 線程」所描述的 。我有軟實時要求和合理的處理器,所以我 不太擔心分配/取消分配消息 到主動幫助程序線程的運行時成本。雖然我堅持一個交叉編譯器 不支持C++ 0x特性的(和補充,我不能使用升壓),我相信我能 實施的一般模式,而無需使用TR1的功能。但是,在這裏我 卡住是如何正確實現未來從活動對象中獲取異步結果 回來?..會使用POSIX互斥和條件變量約POSIX消息隊列中 合理approach..how ?使用C++ 98的活動對象

+0

不能使用升壓,但也許你可以看到他們是如何實現其未來的班,因爲他們將不得不依賴於並行線程在某一點...... – 2012-02-23 04:30:56

回答

1

未來的基本上是圍繞一個緩衝的包裝,以保存結果,一個標誌,表示它已準備好,以保護對它的訪問一個互斥體,並等待一個條件變量。

如果你知道平臺的低級別的設備,你也許可以去優化它,但是這是基本的設置。

當然,緩衝區必須動態分配,所以它可以在活動對象線程和等待線程之間共享,並正確銷燬,所以使用類似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; 
} 

雖然很明顯,你需要添加錯誤檢查,並考慮例外。

+0

感謝掃清事情了不少。假設ref_counted_ptr不必保證這種使用模式的線程安全性是否正確? – giantrobot 2012-02-23 23:40:42

+0

不需要。您需要ref的原因是因爲設置結果的線程和讀取結果的線程都持有指向同一'future_data'對象的指針。您需要確保調整計數是線程安全的,以便只有一個線程試圖銷燬'future_data'對象,並且這是在正確的時間完成的。 – 2012-02-24 07:54:01

1

您可能想看看開放源碼QP/C++ state machine framework和我的書「C/C++中的實用UML狀態圖:嵌入式系統的事件驅動編程」。

的QP/C++框架是一個非常輕量級實現用於實時與活動對象分層狀態機(UML狀態圖)的建模行爲強烈支持嵌入式系統活動對象計算模型。特別是對於你的問題描述,框架已經被移植到POSIX線程中,其中每個活動對象在它自己的p線程中執行並且具有其自己的輕量級事件隊列,該隊列阻止私有條件變量。有關端口的更多信息,請參閱App Note "QP and POSIX"。 QP的完整代碼可從SourceForge.net獲取。