也許我錯過了新std::async
在C++ 11的正確用法異步不執行,但是這個聲明(超過在cppreference.com):的std ::指定發佈::當異步
如果異步標誌被設置(即策略& std :: launch :: async!= 0),然後異步在獨立的執行線程上執行函數f,就像由std :: thread(f,args ...)產生的一樣,除如果函數f返回一個值或引發異常,它將存儲在可通過std :: future訪問的共享狀態中,異步返回給調用者。
讓我覺得,我的線程應該與這一說法立即啓動:
std::async(std::launch::async, MyFunctionObject());
而不必等待調用std::future::get()
。這似乎並非如此(使用MSVC 13編譯)。如果這不是由這個語句本身觸發的,如果我不關心std::future
對象的返回值,該如何觸發?
實施例:
#include <thread>
#include <iostream>
#include <array>
#include <future>
static std::mutex write_mutex;
class Cpp11Threads {
public:
// Function operator for Function-Object
void operator()() {
const int num_threads = 50;
// Static std array
std::array<std::thread*, num_threads> worker_threads;
// Range based
for (std::thread*& thread : worker_threads) {
// Lambda expression
thread = new std::thread(
[] {
static int i = 0;
write_mutex.lock();
std::cout << "Hello, I am happy Std thread #" << i++ << std::endl;
write_mutex.unlock();
});
}
for (std::thread*& thread : worker_threads) {
thread->join();
delete thread;
// nullptr instead of NULL
thread = nullptr;
}
}
};
int main() {
std::async(std::launch::async, Cpp11Threads());
return 0;
}
你如何確定線程是否已經啓動?我在問,因爲'std :: async'這個咒語有着有趣的語義(即它是阻塞的)。 – juanchopanza