《C++ Concurrency in Action》读书笔记一 多线程与线程管理
发布日期:2021-05-07 23:34:51 浏览次数:17 分类:精选文章

本文共 2136 字,大约阅读时间需要 7 分钟。

C++11 多线程支持概述

C++11版本引入了对多线程的STL支持,为程序开发提供了更高效的并发处理能力。通过std::thread,开发者可以轻松创建和管理线程,充分发挥多核处理器的性能。

一、通过Hello World示例引入多线程

#include 
#include
int main() {
std::thread t([]() {
std::cout << "Hello Concurrency World" << std::endl;
});
t.join(); // 等待线程结束
return 0;
}

上述代码通过std::thread创建了一个新的线程,该线程输出“Hello Concurrency World”,随后主线程等待子线程完成后再继续执行。

二、线程管理

1. 线程构造与运行

std::thread的构造函数支持传递任何函数(包括函数、函数对象和lambda表达式)。线程一旦构造后,就可以立即运行,除非调用joindetach等待其完成。

2. 线程状态管理

  • join方法:等待线程结束并释放资源。
  • detach方法:让线程成为守护线程,释放资源给运行时库管理。
  • 未等待线程:如果既不调用join也不调用detach,线程会在栈 unwinding时调用std::terminate()终止程序。

3. 处理异常

#include 
#include
#include
class ThreadGuard {
public:
ThreadGuard(std::thread& t) : t_(t) {}
~ThreadGuard() {
if (t_.joinable()) {
t_.join();
std::cout << "Free the resource for the std::thread" << std::endl;
}
}
private:
std::thread& t_;
};
int main() {
std::thread t([]() {
std::cout << "Hello Concurrency World" << std::endl;
});
ThreadGuard guard(t);
return 0;
}

通过ThreadGuard类,可以在资源释放前确保线程完成。

4. RAII方式管理线程

#include 
#include
#include
int main() {
std::thread *t = new std::thread([]() {
std::cout << "Hello Concurrency World" << std::endl;
});
std::tr1::shared_ptr
ptr(t, release_function);
// 做其他事情...
return 0;
}

使用std::tr1::shared_ptr,可以更方便地管理线程资源。

三、传递线程函数参数

  • 按值传递:默认是拷贝传递,可以传递到线程函数。
  • 引用传递:使用std::ref()强制传递引用。
  • 成员函数传递:通过std::ref()传递对象指针。
  • std::unique_ptr传递:使用std::move进行资源转移。

四、线程管理权转移

  • std::thread不可拷贝但可移动,需谨慎操作。
  • 线程作为函数返回值或参数,可实现线程管理权的转移。

五、线程数量选择

  • 并行执行:通过std::vector<std::thread>创建多个线程并等待完成。
  • 获取硬件线程数std::thread::hardware_concurrency()返回可用线程数。

六、线程标识

#include 
#include
int main() {
std::thread t([]() {
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
});
t.join();
return 0;
}

通过std::this_thread::get_id()获取当前线程的标识符,方便跟踪和管理多线程程序。

总结

C++11的多线程支持极大地简化了并发编程,提供了强大的工具来利用多核计算资源。通过合理运用std::threadjoindetach等方法,可以高效管理线程资源,充分发挥并行处理的优势。

上一篇:《C++ Concurrency in Action》读书笔记二 线程之间共享资源
下一篇:第一篇 |はじめまして

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月24日 08时22分00秒