反向迭代器
占位
占位
tryLock 是防止自锁的一个重要方式。
tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
lock()方法去获取锁,当获取不到锁的时候,会一直等待,直到获取到锁。
explicit表明该函数时显式的,不能进行自动地隐式类型转换。
class Demo{
public:
Demo(); //没有参数,无法进行类型转换
Demo(double a); //有一个参数,可以进行类型转换
Demo(int a, double b); //有两个参数,无法进行类型转换
Demo(int a, int b = 10, double c = 1.6); //有三个参数,其中两个参数有默认值,故可以进行隐式转换
~Demo();
...
};
implicit 隐式的,类构造函数默认情况下声明为隐式的
class Demo{
public:
Demo();
explicit Demo(double a); // 无法进行隐式转换
Demo(int a,double b);
~Demo();
};
Demo test;
test = 12.2 ×
test = (Demo)12.2 √
static_cast是一个c++运算符,功能是把一个表达式转换为某种类型,但没有运行时类型检查来保证转换的安全性。
#include <iostream>
using namespace std;
int main() {
double a = 3.236;
int b = static_cast<int>(a);
cout << b <<endl;
cout << sizeof(b) << endl;
return 0;
}
3
4
没有 volatile 时,线程A 会将操作结果写到 CPU 缓存中,而不是内存中,有机会的时候(比如,CPU 缓存不够用的时候),才会将 CPU 缓存中的内容存到内存,存到内存以后,其他线程就可以看到了。
而 volatile 将结果写入 CPU 缓存的同时,就会将结果写入到内存中。
static 修饰的变量在程序中只会初始化一次,在线程间共享,理论上,在某一个线程中修改了变量,其他的线程会马上发现。但是,为了提高优化速度和运行速度,一个线程修改这个变量是不一定立即写回内存让其它线程看到的,这时候就需要用volatile强制要求每次改变都写回内存了。