随笔分类 - C++ 并发编程
摘要:std::packaged_task 包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,从包装可调用对象意义上来讲,std::packaged_task 与 std::function 类似,只不过 std::packaged_task 将其包装的可调用对象的执行结果传递给一个 std:
阅读全文
摘要:std::promise的作用就是提供一个不同线程之间的数据同步机制,它可以存储一个某种类型的值,并将其传递给对应的 future, 即使这个 future 与 promise 不在同一个线程中也可以安全的访问到这个值。 std::promise<int> promiseObj; 可以通过get_f
阅读全文
摘要:C++11 提供了std::future类模板,future 对象提供访问异步操作结果的机制,很轻松解决从异步任务中返回结果。 在 C++ 标准库中,有两种“期望”,使用两种类型模板实现(这里主要介绍的是唯一期望): 唯一期望(unique futures,std::future<>) 实例只能与一
阅读全文
摘要:C++11提供了异步接口std::async,通过这个异步接口可以很方便的获取线程函数的执行结果。std::async会自动创建一个线程去调用线程函数,它返回一个std::future,这个future中存储了线程函数返回的结果,当我们需要线程函数的结果时,直接从future中获取,非常方便。但是我
阅读全文
摘要:C++标准库对条件变量有两套实现:std::condition_variable 和 std::condition_variable_any 。 这两个实现都包含在 <condition_variable> 头文件的声明中。 两者都需要与一个互斥量一起才能工作(互斥量是为了同步); 前者仅限于与 s
阅读全文
摘要:C++11 标准中定义了另外一个与 Mutex RAII 相关类 unique_lock,该类与 lock_guard 类相似,也很方便线程对互斥量上锁,但它提供了更好的上锁和解锁控制。 unique_lock 对象以独占所有权的方式( unique owership)管理 mutex 对象的上锁和
阅读全文
摘要:std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class Mutex> class lock_guard; lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_g
阅读全文
摘要:C++中通过实例化 std::mutex 创建互斥量, 通过调用成员函数lock()进行上锁, unlock()进行解锁。 不过, 不推荐实践中直接去调用成员函数, 因为调用成员函数就意味着, 必须记住在每个函数出口都要去调用unlock(), 也包括异常的情况。 C++标准库为互斥量提供了一个RA
阅读全文
摘要:线程标识类型是 std::thread::id , 可以通过两种方式进行检索。 第一种, 可以通过调用 std::thread 对象的成员函数 get_id() 来直接获取。 如果 std::thread 对象没有与任何执行线程相关联, get_id() 将返回 std::thread::type
阅读全文
摘要:假设要写一个在后台启动线程的函数, 想通过新线程返回的所有权去调用这个函数, 而不是等待线程结束再去调用; 或完全与之相反的想法: 创建一个线程, 并在函数中转移所有权,都必须要等待线程结束。 总之, 新线程的所有权都需要转移。这就是移动引入 std::thread 的原因。 C++标准库中有很多资
阅读全文
摘要:向 std::thread 构造函数中的可调用对象, 或函数传递一个参数很简单。 需要注意的是, 默认参数要拷贝到线程独立内存中, 即使参数是引用的形式, 也可以在新线程中进行访问 。 void f(int i, std::string const& s); std::thread t(f, 3,
阅读全文
摘要:当倾向于在无异常的情况下使用join()时, 需要在异常处理过程中调用join(), 从而避免生命周期的问题。 struct func; // 定义在清单2.1中 void f() { int some_local_state=0; func my_func(some_local_state); s
阅读全文
摘要:如果不等待线程, 就必须保证线程结束之前, 可访问的数据得有效性。 这种情况很可能发生在线程还没结束, 函数已经退出的时候, 这时线程函数还持有函数局部变量的指针或引用。 struct func { int& i; func(int& i_) : i(i_) {} void operator() (
阅读全文
摘要:线程在 std::thread 对象创建(为线程指定任务)时启动。 最简单的情况下, 任务也会很简单, 通常是无参数无返回(void-returning)的函数 。 使用C++线程库启动线程, 可以归结为构造 std::thread 对象: void do_some_work(); std::thr
阅读全文