美文网首页程序员
C++ 并发编程学习(四)

C++ 并发编程学习(四)

作者: rmrfany | 来源:发表于2018-12-22 12:06 被阅读16次

转移线程所有权

一. std::thread 实例之间(t1,t2和t3)转移所有权

void some_function();
void some_other_function();
std::thread t1(some_function); // 1
std::thread t2=std::move(t1); // 2
t1=std::thread(some_other_function); // 3
std::thread t3; // 4
t3=std::move(t2); // 5
t1=std::move(t3); // 6 赋值操作将使程序崩溃

  当显式使用 std::move() 创建t2后②,t1的所有权就转移给了t2。之后,t1和执行线程已经没有关联了;执行some_function的函数现在与t2关联。
  然后,与一个临时 std::thread 对象相关的线程启动了③。为什么不显式调用 std::move() 转移所有权呢?因为,所有者是一个临时对象——移动操作将会隐式的调用。
  t3使用默认构造方式创建④,与任何执行线程都没有关联。调用 std::move() 将与t2关联线程的所有权转移到t3中⑤。
  因为t2是一个命名对象,需要显式的调用 std::move() 。移动操作⑤完成后,t1与执行some_other_function的线程相关联,t2与任何线程都无关联,t3与执行some_function的线程相关联。
  最后一个移动操作,将some_function线程的所有权转移⑥给t1。不过,t1已经有了一个关联的线程(执行some_other_function的线程),所以这里系统直接调用 std::terminate() 终止程序继续运行。这样做(不抛出异常, std::terminate() 是noexcept函数)是为了保证与 std::thread 的析构函数的行为一致,进行赋值时也需要满足这些条件(说明:不能通过赋一个新值给 std::thread 对象的方式来"丢弃"一个线程
  std::thread 支持移动,就意味着线程的所有权可以在函数外进行转移。当所有权可以在函数内部传递,就允许 std::thread 实例可作为参数进行传递。

二. std::thread 对象的容器

void do_work(unsigned id);
void f(){
    std::vector<std::thread> threads;
    for(unsigned i=0; i < 20; ++i){
        threads.push_back(std::thread(do_work,i)); // 产生线程
    }
    std::for_each(threads.begin(),threads.end(),std::mem_fn(&std::thread::join)); // 对每个线程调用join()
}

  将 std::thread 放入 std::vector 是向线程自动化管理迈出的第一步:并非为这些线程创建独立的变量,并且将他们直接加入,可以把它们当做一个组。

相关文章

  • C++ 并发编程学习(四)

    转移线程所有权 一. std::thread 实例之间(t1,t2和t3)转移所有权   当显式使用 std::...

  • Chapter 4:同步

    本章主要介绍《C++并发编程实战》的第四章内容。 condition variables && future 很重...

  • JAVA并发编程与高并发解决方案 - 并发编程 四 之 J.U.

    JAVA并发编程与高并发解决方案 - 并发编程 四 相关文章 JAVA并发编程与高并发解决方案 - 并发编程 一 ...

  • C++ 并发编程学习(六)

    识别线程 一. 获得线程标识(std::thread::id ) std::thread 对象的成员函数 get_...

  • C++ 并发编程学习(九)

    保护共享数据的替代设施 一. std::once_flag 和 std::call_once 二. 一个 std:...

  • C++ 并发编程学习(一)

    一. 任务切换与硬件并发 以前,大多数计算机只有一个处理器,具有单个处理单元(processing unit)或...

  • C++ 并发编程学习(七)

    共享数据带来的问题   双链表中每个节点都有一个指针指向列表中下一个节点,还有一个指针指向前一个节点。其中不变量就...

  • C++ 并发编程学习(八)

    使用互斥量保护共享数据   互斥量是 C++ 中一种最通用的数据保护机制,但它不是“银弹”;精心组织代码来保护正确...

  • C++ 并发编程学习(二)

    线程管理的基础 一. 启用线程 线程的使用需要头文件 ,以及在编译的时候需要使用 -lpthread;起线程时初始...

  • C++ 并发编程学习(三)

    向线程函数传递参数 一. 传参const char*   函数f需要一个 std::string 对象作为第二个参...

网友评论

    本文标题:C++ 并发编程学习(四)

    本文链接:https://www.haomeiwen.com/subject/wwmykqtx.html