C++并发编程实战
第2章:重点
1、
首先判断线程是否已加入, 如果没有,会调用join()进行加入。 这很重要!!!!!!
因为join()只能对给定的对象调用一次, 所以对给已加入的线程再次进行加入操作时,将会导致错误。
if (t_.joinable())//只能调用一次join,suoyi 之后就不再joinable。
{
t_.join();
}
2、
拷贝构造函数和拷贝赋值操作被标记为 =delete ③, 是为了不让编译器自动生成它们。
直接对一个对象进行拷贝或赋值是危险的,!!!!
因为这可能会弄丢已经加入的线程。 通过删除声明, 任何尝试给thread_guard对象赋值的操作都会引
发一个编译错误。 想要了解删除函数的更多知识, 请参阅附录A的A.2节。
thread_guard(thread_guard const&) = delete;
thread_guard& operator=(thread_guard const&) = delete;
3、
每个 std::thread 只能被进行一次 join() 或 detach(),操作后 joinable() 由 true 变为 false。
4、
在传递到 std::thread 构造函数之前就将字面值转化为 std::string 对象:
void f(int i,std::string const& s);
char buffer[1024]; // 1
sprintf(buffer, "%i",some_param);
std::thread t(f,3,buffer); // 2
需要将 std::thread t(f, 3, buffer); // 2
改成=》std::thread t(f, 3, std::string(buffer)); // 使用std::string, 避免悬垂指针
5、对于传非常引用时,直接传值会报错
widget_data data;
thread t(udpate_data_for_widget, data);
需要改成ref
thread t(udpate_data_for_widget, ref(data));
6、转移所有权
使用move来转移
如果转移到一个已经关联的线程,会抛出异常!(一个线程只能关联一个线程任务(线程函数),如果给他关联多个会出错!)
7、std::thread::hardware_concurrency()
在新版C++标准库中是一个很有用的函数。 这个函数会返回在一个程序中“能并发的线程数量”;如果没有定义,则返回0
计算量的最大值(任务)和硬件支持线程数中, 较小的值为启动线程的数量:
unsigned long const num_threads= std::min(hardware_threads != 0 ? hardware_threads : 2, max_threads);
8、线程标识类型为 std::thread::id,并可以通过2种方式进行检索。
第一种,可以通过调用 std::thread 对象的成员函数 get_id() 来直接获取。
如果 std::thread 对象没有与任何执行线程相关联, get_id() 将返
回 std::thread::type 默认构造值,这个值表示“无线程”。
第二种,如果在当前线程中,调用 std::this_thread::get_id() (这个函数定义在 <thread> 头文件中)也可以获得线程标识。
第4章:重点知识
参考:
《c++并发编程实战》 笔记-CSDN博客
C++并发编程学习笔记_c++并发编程笔记-CSDN博客
C++并发编程实战学习笔记-CSDN博客
《C++并发编程实战》读书笔记(3):并发操作的同步 - MoonZZZ - 博客园
《C++并发编程实战》读书笔记(2):并发操作的同步-腾讯云开发者社区-腾讯云