2013-07-09 50 views
0

使用C++我打算有一個producer進程寫入數據vector,然後幾個consumer進程讀取數據。將有一個共享內存段(Boost :: Interprocess),其中將存儲數據vector。問題是:我無法控制第三方應用程序啓動進程的順序,可能是consumer可能在producer生成任何數據之前啓動。有什麼機制可以協調進程,以便可以命令consumer進程耐心等待,直到producer表示數據準備就緒;不管流程啓動的順序如何?C++協調進程何時啓動?

回答

0

我猜命名信號量是個不錯的選擇。生產者和消費者應用程序應該同意(硬編碼)信號量的名稱,如/ tmp/mySem,並且只有生產者必須創建併發布信號量,而消費者應該等待信號量的存在和狀態。

+0

感謝您的。你能提供一個如何建立和使用信號量的簡單例子嗎? – GoFaster

+0

我在Boost文檔中看到,當一個post()操作發生在一個信號量上時,只有一個等待進程被喚醒。所有等待的線程怎麼會被喚醒,或者一起或者一個一個地喚醒? – GoFaster

+0

也許你應該使用條件變量同步mchenizm而不是信號量。作爲互斥體的條件變量可以創建爲共享,然後您可以使用broadcast()API一次喚醒所有等待者。在PTHREAD庫中,您需要查找pthread_cond_init(),pthread_condattr_setpshared(),pthread_mutex_init()和pthread_cond_broadcast –

0

如果創建共享內存是生產者進程的責任,那麼您可以使用boost barrier來同步啓動。

您可以創建創建共享內存的屏障,也可以創建一些要部署的作業。消費者流程到達這個障礙後,可以繼續處理它們。

你可以看看升壓屏障的細節在此page

+0

好的,我明白了;所以我需要在實例化時向Barrier對象提供要等待的進程數量。這個數字必須是硬編碼的還是由用戶提供的?看,如果程序可以使用更靈活的機制,它可以處理任何數量的進程而無需用戶交互,那將是非常好的。 – GoFaster