我使用vc2011和原来的标准::异步(STD ::推出::异步,...)是有点马车(有时不产生新的线程,并运行它们平行,而是重用线程和运行任务一个接一个)。 这是太慢了,当我做昂贵的网络电话。 所以,我想我会写我自己的异步功能。 我越来越虽然卡住,应该在哪里标准::答应住? 在1)的线程的功能,2)异步函数,或3)调用者函数。
码:
#include <future>
#include <thread>
#include <iostream>
#include <string>
#include <vector>
std::string thFun() {
throw std::exception("bang!");
return "val";
}
std::future<std::string> myasync(std::promise<std::string>& prms) {
//std::future<std::string> myasync() {
//std::promise<std::string> prms; //needs to outlive thread. How?
std::future<std::string> fut = prms.get_future();
std::thread th([&](){
//std::promise<std::string> prms; //need to return a future before...
try {
std::string val = thFun();
prms.set_value(val);
} catch(...) {
prms.set_exception(std::current_exception());
}
});
th.detach();
return fut;
}
int main() {
std::promise<std::string> prms; //I really want the promise hidden iway in the myasync func and not live here in caller code but the promise needs to outlive myasync and live as long as the thread. How do I do this?
auto fut = myasync(prms);
//auto fut = myasync(); //Exception: future already retrieved
try {
auto res = fut.get();
std::cout << "Result: " << res << std::endl;
} catch(const std::exception& exc) {
std::cout << "Exception: " << exc.what() << std::endl;
}
}
我似乎无法让过去的标准::承诺需要活得比异步性的作用(只要线程活着),所以承诺不能作为生活在异步FUNC一个局部变量。 但在主叫用户代码的std ::承诺不应该住在任,作为主叫方只需要了解期货。 ,我不知道如何使承诺住在线程函数作为异步需要返回一个未来它甚至调用线程FUNC之前。 我抓我的头就这一个。
任何人有什么想法?
编辑:我在这里强调这是上面的评论是有点误导。 虽然标准:: asycn默认被允许成为dererred模式下,当的std ::推出的启动策略::异步明确设置它必须表现得“好像”线程启动,并同时运行(见措辞EN .cppreference.com / W / CPP /线程/异步)。 参见一个情况下,这不是在vs20011看到behavioured在pastebin.com/5dWCjjNY的例子。 该解决方案的伟大工程,以10倍加速了我的现实世界的应用程序。
编辑2:MS固定在错误。 更多资讯: https://connect.microsoft.com/VisualStudio/feedback/details/735731/std-async-std-launch-async-does-not-behave-as-std-thread