C++并发编程实战

Wesley13
• 阅读 345

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. 精心组织代码来保护共享数据

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

点赞
收藏
评论区
推荐文章
Chase620 Chase620
3年前
Promise从入门到拿Offer之手写Promise
1、Promise构造函数的实现Promise构造函数用来声明示例对象,需要传入一个执行器函数。其中包括resolve函数和reject函数,以及几个重要的属性:状态属性、结果属性和回调函数队列。构造函数的基本框架resolve函数用于异步处理成功后调用的函数。其中包括验证对象状态修改次数,修改promise实例对象状态,异步调用成功的回调函数
Wesley13 Wesley13
2年前
java成员变量的初始化
类变量(static变量,不需要实例化对象也可以引用)实例变量(非static变量,需要实例化对象)局部变量(类的成员函数中的变量)初始化方式:构造函数初始化变量声明时初始化代码块初始化java自动初始化(在构造函数执行之前执行) java保证所有变量被使用之前都是经过初始化的(声明并且定义过,被赋值
可莉 可莉
2年前
06. react 初次见面
    React元素的事件处理和DOM元素的很相似。但是有一点语法上的不同:React事件绑定属性的命名采用驼峰式写法,而不是小写。如果采用JSX的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法)    例如,传统的HTML:<buttononclick"activateLas
Wesley13 Wesley13
2年前
Java 中的堆和栈
Java中的堆和栈简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存。      在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。      当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的
Stella981 Stella981
2年前
Fortran 怎么在子程序中调用主程序中定义的变量?
注意:如果变量是一维的,即一个数,那么不用定义其维度为“A(1)”,直接定义双精度变量,即可在之后的运算中调用,否则需要在之后的调用中输入“A(1)”而不是“A”。类似地,若变量是1\n或n\1的矩阵形式,则仅需要将变量定义为“A(n)”即可。例如:programmainimplicitnonedimens
Wesley13 Wesley13
2年前
C++中构造函数和析构函数
构造函数定义它是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。另外,一个类可以有多个构造函数,我们可以根据其参数个数的不同或参数类型的不同来区分它们(这就是构造函数的重载)特点1.构造函数的命名必须和类名完全相同;2.构造函数的功能主要用于在类的对象创建时定义
Stella981 Stella981
2年前
IDA Pro 权威指南学习笔记(十)
栈帧(stackframe)是在程序的运行时栈中分配的内存块,用于特定的函数调用如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存1.传给函数的参数的值需要存储到函数能够找到它们的位置2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们
Wesley13 Wesley13
2年前
C++中类中范围解析运算符::和点运算符(.)
C 类成员函数类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。让我们看看定义的类Box,现在我们要使用成员函数来访问类的成员,而不是直接访问这些类的成员:classBox{public:double
Wesley13 Wesley13
2年前
Underscore解析html模板
Underscore的\_.template模板函数只能解析3种模板标签<% %:用于包含Js代码,这些代码将在渲染数据时被执行。<%%:用于输出数据,可以是一个变量、对象的属性、或函数(输出函数的返回值)。<%%:用于输出数据,同时会将数据中包含的HTML字符转换为实体形式(例如它会将双引号转换为&quot;形式),用于避免X
小万哥 小万哥
1个月前
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C构造函数构造函数是C中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。构造函数类型C支持多种类型的构造函数,用于满足不同的初始化需求:默认构造函数:不带参数的构造函