Month: March 2019

  • 【C++11】异步执行之既有函数的包装:packaged_task类和async方法

    上篇中讲到,C++11的标准库提供了promise用于在线程执行的具体方法中返回数据,接收端通过future阻塞获取。这么做的前提是你可以修改方法的参数,或者说你需要写一个包装函数。想要让既有函数异步的话,你可以使用packaged_task类或者async方法。 具体分析之前,以下代码是在线程中需要执行的方法。 MyString some_function() { return MyString{“foo”}; } MyString是很早之前自己用来查看copy/move次数的类,不想用的话,可以替换为std::string。 packaged_task packaged_task是一个封装了被调用的函数的task。注意,packaged_task本身并不提供异步执行的机制,所以你仍旧需要把packaged_task放到thread中去执行。 std::packaged_task<MyString()> task{some_function}; std::future<MyString> future = task.get_future(); std::thread task_thread{std::move(task)}; task_thread.join(); MyString string = future.get(); std::cout << string << std::endl;

  • 【C++11】基于std::thread异步执行时的输入输出

    本篇主要是记录自己在学习C++11下std::thread异步执行时的一些细节性的东西,为之后基于C++11写并发代码打基础。 C++11引入了std::thread。据说之前因为需要区分对待pthread和win下的线程库,代码中有大量的预编译的if else,非常丑陋。现在的话,统一用std::thread就行了。 基于std::thread最简单的异步执行代码。 #include <iostream> #include <thread> void thread_run() { std::cout << “thread run\n”; } int main() { std::thread thread1{thread_run}; thread1.join(); return 0; }