我已經寫了下面的代碼來測試std::async()
函數返回void
與Ubuntu上的GCC 4.8.2。std :: async保證被調用返回void的函數嗎?
#include <future>
#include <iostream>
void functionTBC()
{
std::cerr << "Print here\n";
}
int main(void)
{
#ifdef USE_ASYNC
auto i = std::async(std::launch::async, functionTBC);
#else
auto i = std::async(std::launch::deferred, functionTBC);
#endif
//i.get();
return 0;
}
如果i.get();
未被註釋,消息"Print here"
總是存在;然而,如果i.get();
被註釋掉,"Print here"
存在當且僅當USE_ASYNC
被定義(即,std::launch::async
總是導致消息打印出來,而std::launch::deferred
從來沒有)。
這是有保證的行爲嗎?確保執行異步調用void
的正確方法是什麼?
如果您要求推遲推出並且從未在未來調用.get,那麼您的函數將永遠不會執行。這與返回void或任何其他類型的函數無關。 – sbabbi