如果你想要一個函數在主線程中運行,你將不得不實現某種類型的消息傳遞系統。因此,例如,您將啓動您的主線程,然後啓動工作線程。工作線程可以完成工作,而主線程將等待工作線程的返回值(即主線程將檢查消息隊列或其他特性)。當工作線程完成時,它將通過指向它想讓主線程運行的函數的指針傳遞給主線程的消息隊列的結構(即消息)。您的郵件可以很簡單:
struct message
{
typedef void (*func_ptr)(void); //or whatever your function signature would be
func_ptr function;
bool finished;
message(): function(NULL), finished(false) {}
};
因此,當工作線程完成後,它會創建一個新的消息,初始化消息中的函數指針,並推動該消息返回到隊列,主線程是等待。主線程然後從隊列中讀取消息,並調用該函數。
順便說一句,使主線程「等待」而不必將其保留在循環中並消耗CPU週期的有效方法是在主線程和工作者之間使用信號量或條件變量(如boost::condition
) 。
與一個或多個音符......一個「消息隊列」是一個簡單的std::queue<message>
用適當的鎖定訪問主線程讀取,並輔助線程寫入。對於主線程寫入的工作線程,也可以有另一個消息隊列,如果需要線程之間的雙向通信,則工作線程將讀取。
你正在尋找一個消息隊列。 – 2011-05-20 11:48:09
當然,如果你睡在主線程上,你會阻塞主線程。你還會期待什麼?睡覺不能像廣告一樣工作? – 2011-05-20 11:58:33
(另外,抱歉,我的意思是[消息泵(http://en.wikipedia.org/wiki/Event_loop))。 – 2011-05-20 11:59:56