写代码的时候突然想到一种情况,顺手测试了下发现和预想的不一样,记录一下。
代码是这样的:
#include <iostream>
#include <thread>
void printfValue(const int& value) {
while (true) {
std::cout << "printf: " << value << "\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
void changeValue(int& value) {
while (true) {
std::cout << "change: " << value++ << "\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main() {
int value = 10;
std::thread thPrintf(printfValue, value);
std::thread thChange(changeValue, std::ref(value));
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(100));
}
return 0;
}
很简单的功能,想看看对同一个地址的数据读写的更新结果。
运行结果是:
printfValue的值一直没有变化。
按理来说,既然是&,那就是指向的同一块地址,就算是const,那也只是不能修改,但读取应该是一样的才对。
分析之后,觉得这种说法比较正确:
在std::thread的时候,如果参数是引用,那就要使用std::ref(),如果没有,编译器就会创建一个临时变量存储value的值,并且把这个临时变量的地址给printfValue,所以就算changeValue修改value的值,printfValue也不会改变。
修改代码后:
std::thread thPrintf(printfValue, std::ref(value));
std::thread thChange(changeValue, std::ref(value));
结果如下:
ok,这就得到想要的效果了。
除此之外,如果改成:
就会得到这样的编译错误: