2015-04-16 56 views
2

第一次在C++中使用線程。我一直在尋找使用boost,這對我來說非常困惑。基本上所有我想要做的是:增強異步主線程回調

  1. 創建一個工作線程異步做一些工作。在工作完成時繼續主線程。
  2. 工作線程完成後,用一些在主線程上下文中執行的結果觸發一個回調函數。

因此,類似於C#中的線程處理。

似乎沒有任何支持2.使用io_service和異步函數,然後使用io_service上的run()似乎阻止主線程。所以不是非常異步。

我使用boost ::未來按照這裏的例子嘗試:Using boost::future with "then" continuations

這裏的「然後」的延續是在一個單獨的線程中完成的,而不是主線程,所以不是我後。有什麼辦法可以改變它嗎?使用boost :: launch :: deferred和wait()使得調用同步,所以這也沒有幫助。與在boost :: future構造中使用get()一樣。

似乎唯一的選擇是創建一個互斥鎖共享事件隊列,並且只是在主線程中持續輪詢它以獲取新數據?

回答

1

爲了開始處理回調,搶佔主線程是非常不尋常的。即使在「C#中的線程處理」(這是一個相當廣泛的主題)中,主線程通常會在處理線程的message queue時處理回調。

因此,通常情況下,主線程只在準備好時執行回調。一種實現方法是通過在io_service上調用run()。

您的主線程一次只能處理一個消息隊列。如果您的應用程序恰好是Windows GUI應用程序,那麼您的主線程已經在處理消息隊列(Windows消息隊列),並且不應該對IO服務(正在處理另一個消息隊列)執行像run() )。在這種情況下,您可以決定編寫將回調封裝在Windows事件消息中並處理該消息的代碼。

如果您碰巧在使用Qt,那麼this question的答案將告訴您如何將一個asio io_service與您的消息循環(我沒有試過那個)結合起來。

如果你的過程不是一個GUI應用程序,那麼,因爲你已經對asio有點熟悉了,所以你仍然可以使用io_service。然而,在這種情況下,主線程執行的函數(在初始化之後)應該作爲該消息隊列上的事件運行。例如:在你的問題中的「繼續主線程」可以作爲io_service上的另一個回調來實現。