我有以下简化代码,在编写时我觉得很好,但我似乎有一些随机访问违规。
最初我认为只要传递给异步的参数在堆栈上,而不是临时变量,代码就是安全的。我还认为文件名和额外的数据会破坏/考虑它们离开范围时的支撑。
它做了一些更多的研究,并阅读了显然编译器用于优化的'似乎'原则。我经常看到堆栈变量在调试器中使用后立即被优化掉了。
我的问题基本上是,保证那些堆栈变量将在运行的异步函数的整个持续时间内存在。对未来的.get()调用显然会在两个堆栈变量离开作用域之前同步调用。
我目前的想法是,它不是线程安全的,因为编译器在调用函数后无法看到正在使用的变量,因此认为删除它们是安全的。我可以轻松地更改代码以消除问题(如果有的话),但我真的想了解这一点。
AV的随机性在一些计算机上比其他计算机发生的更多表明它是一个问题,并且调度顺序决定了这是否是一个问题。
非常感谢任何帮助。
#include <future>
#include <fstream>
#include <string>
#include <iostream>
int write_some_file(const char * const filename, int * extra_result)
{
std::ofstream fs;
try {
fs.open(filename);
} catch (std::ios_base::failure e) {
return 1;
}
fs << "Hello";
*extra_result = 1;
return 0;
}
int main(void)
{
std::string filename {"myffile.txt"};
int extraResult = 0;
auto result = std::async(std::launch::async, write_some_file, filename.c_str(), &extraResult);
// Do some other work
// ...
int returnCode = result.get();
std::cout << returnCode << std::endl;
std::cout << extraResult << std::endl;
return 0;
}