C++并发编程实战—阅读笔记

1. 当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”。如果传递了一个临时变量,而不是一个命名的变量;C++编译器会将其解析为函数声明,而不是类型对象的定义。

例如:

class background_task
{
public:
void operator()() const
{
do_something();
do_something_else();
}
};
background_task f;
std::thread my_thread(f);//正确

std::thread my_thread(background_task());//???my_thread变成了一个函数

???这里相当与声明了一个名为my_thread的函数,这个函数带有一个参数(函数指针指向没有参
数并返回background_task对象的函数),返回一个 std::thread 对象的函数,而非启动了一个
线程。

使用在前面命名函数对象的方式,或使用多组括号①,或使用新统一的初始化语法②,可以避
免这个问题。
如下所示:

std::thread my_thread((background_task())); // 1
std::thread my_thread{background_task()}; // 2

使用lambda表达式也能避免这个问题。

std::thread my_thread([]{
do_something();
do_something_else();
});

 

2. 精心组织代码来保护共享数据

切勿将受保护数据的指针或引用传递到互斥锁作用域之外,无论
是函数返回值,还是存储在外部可见内存,亦或是以参数的形式传递到用户提供的函数中
去。

原文链接: https://www.cnblogs.com/zhanghu52030/p/9322958.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++并发编程实战---阅读笔记

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/392074

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月1日 下午3:22
下一篇 2023年4月1日 下午3:22

相关推荐