Ole*_*rov 2 c++ asynchronous visual-c++ c++11 ppl
我很有意思.在PPL建设的目的是什么?我在哪里可以测试它?似乎Visual Studio 2012还不支持它(可能是未来的一些CTP?).它在标准C++ 11异步库中是否具有等价物?
目的是让您能够表达必须按顺序执行的异步任务.
例如,假设我在GUI应用程序中.当用户按下按钮时,我想异步启动任务以在线检索文件,然后处理它以检索某种数据,然后使用该数据更新GUI.虽然这种情况正在发生,但仍有大量其他任务正在进行,主要是为了保持GUI响应.
这可以通过使用调用回调的回调来完成.与lambdas关联的.then()功能允许您编写实例化它的所有回调内容(如果需要,您仍然可以使用单独的回调).它也不保证每个单独任务的工作将由同一个线程完成,如果初始线程已经有太多的工作要做,则可以使空闲线程窃取任务.
.then()函数在C++ 11中不存在,但建议将其添加到std :: future类(它基本上是任务或任务结果的句柄).
克莱姆已经做出了很好的回答,但我想我会给出一个具体的例子.
.then附加到任务的延续,并且.get基本上是同步的异步.
C++ 11有std::future,相当于一个concurrency::task.std::future目前只有.get,但有一个建议添加.then(和其他好东西).
std::async(calculate_answer(the_question_of_everything))
.then([](std::future<int> f){ std::cout << f.get() << "\n"; });
Run Code Online (Sandbox Code Playgroud)
上面的代码片段将创建一个异步任务(启动时std::async),然后附加一个延续,std::future一旦上述任务完成,它就会传递完成的任务.这实际上返回另一个std::future用于该任务,而目前C++的11个标准会阻止它的析构函数,但让析构函数疏导另一项建议.因此,使用上面的代码,您可以创建一个即发即弃的任务,一旦计算出答案就会打印出答案.
阻止等价物将是:
auto f = std::async(calculate_answer(the_question_of_everything));
std::cout << f.get() << "\n";
Run Code Online (Sandbox Code Playgroud)
此代码将阻止,f.get()直到答案可用.
| 归档时间: |
|
| 查看次数: |
6665 次 |
| 最近记录: |