c++ 异步并行编程

Cplusplus
ccc
初来炸道
初来炸道
帖子: 7
注册时间: 2016年09月18日 21:50
拥有现金: 锁定
Been thanked: 5 times
联系:

c++ 异步并行编程

帖子 #1 ccc » 2017年06月02日 10:53

主要头文件:future
学习 future 编程的前提是会了 std::condition_variable,否则对 std::future 系之 wait, set_*,get 的理解有障碍。
1. std::async
创建一个异步 future, 第一个参数设置策略,可以是
std::launch::async 异步策略:自动并行;
std::launch::deferred 延迟策略:只有使用 std::future 的 wait, get 方法才会触发执行;
2. std::packaged_task
包裹一个执行序,它是一个 moveable 类型的线程执行序,可以用 get_future 方法获得 future
3. std::promise
良好的 set/get 封装,实现 promise/future 并行化 (诺言/兑现并行? :coverface1 不知道中文怎么表达了),良好的异常处理机制封装
上面这些话全是个人领悟了,具体的应该多写一些 c++ future 代码才可以理解异步,不然是不是看的不知所云呢? :speechless3
简单又傻瓜的例子
Code: [全选] [展开/收缩] [Download] (cxx-simple-async.cpp)
  1. #include <future>
  2. #include <iostream>
  3.  
  4. int main() {
  5.     std::future<void> autoLauncher = std::async(
  6.         std::launch::async, [] () {
  7.             std::cout << "Child Thread!\n";
  8.             for (int i=0; i<10; i++) {
  9.                 std::cout << i << std::endl;
  10.             }
  11.         }
  12.     );
  13.  
  14.     std::cout << "Main Thread\n";
  15. }

编译: clang++ cxx-simple-async.cpp -stdlib=libc++ -std=c++1z -lthr -o prog1

例子 2:在 std::async 异步模式直接用原生的 std::condition_variable
Code: [全选] [展开/收缩] [Download] (simple-async-and-cv.cpp)
  1. #include <future>
  2. #include <chrono>
  3. #include <condition_variable>
  4. #include <iostream>
  5.  
  6. int main() {
  7.         auto costlessSleep = [] () {
  8.                 std::this_thread::sleep_for(std::chrono::nanoseconds(1));
  9.         };
  10.  
  11.         std::mutex mutex;
  12.         bool ready = false;
  13.         std::condition_variable cv;
  14.  
  15.         // 默 认 策 略 为  std::launch::async, 如 果 不 是 , 请 升 级 编 译 器
  16.         auto f = std::async([&cv, &mutex, &ready] () { // 引 用 捕 捉  cv, mutex, ready
  17.                 std::unique_lock<std::mutex> lock(mutex);
  18.                 for (int i=0; i<10; i++) {
  19.                         std::cout << "Waiting ... (ready: "
  20.                                 << std::boolalpha << ready << ")\n";
  21.                         cv.wait(lock, [&ready] () {return ready==true;});
  22.                         std::cout << "Notified. (ready: "
  23.                                 << std::boolalpha << ready << ")\n";
  24.                         ready = false;
  25.                         std::cout << "ready=>false" << std::endl;
  26.                 }
  27.         });
  28.  
  29.         for (int i=0; i<12; i++) {
  30.                 costlessSleep();
  31.                 std::unique_lock<std::mutex> lock(mutex);
  32.                 ready = true;
  33.                 std::cout << "ready=>true" << std::endl;
  34.                 lock.unlock();
  35.                 cv.notify_one();
  36.         }
  37. }

编译同上,运行结果如下:

代码: 全选

Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
Waiting ... (ready: false)
ready=>true
Notified. (ready: true)
ready=>false
ready=>true
ready=>true

如果代码有编译问题或者运行后并行效果没有或者崩溃,那么你的编译器支持 c++14 (17) 力度不够。
FreeBSD 针对 LLVM 做了很多的移植和底层优化,因而编译 c++ 快速且代码稳定,clang 是支持 c++ 最好的编译器
FreeBSD :ugeek:

回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客