有没有办法将缓冲区转储到文件原子?
"原子地"是指:如果有人在写作期间终止我的应用程序,我希望文件处于写入前或写入状态,但不是处于损坏的中间状态.
如果答案是"否",那么可能是用一个非常小的缓冲区来完成的?例如,我可以使用单个8字节fwrite(在x64平台上)转储2个后续的int32_t变量,并确保这两个int32都被转储,或者它们都没有,但不仅仅是其中一个?
我将我的问题总结为以下简短程序.
它仅在-O3模式下导致SEGFAULT(-O2工作正常).根据gdb它发生*f = 0在线.
#include <iostream>
void func1(int s, int t)
{
char* buffer = new char[s + t*sizeof(float)];
if (!buffer)
{
std::cout << "new failed\n";
return;
}
float* f = (float*)(buffer + s);
for (int i = 0; i < t; ++i)
{
*f = 0;
//std::cout << i << std::endl; // if uncomment this line everything will work fine
++f;
}
delete [] buffer;
std::cout << "done\n";
}
int main()
{
int s = …Run Code Online (Sandbox Code Playgroud)