假设一个程序有一个缓存机制,在某个特定计算结束时,程序将该计算的输出写入磁盘,以避免以后在重新运行程序时重新计算它。它为大量计算执行此操作,并将每个输出保存到单独的文件中(每个计算一个,文件名通过计算参数的散列确定)。数据使用标准 C++ 流写入文件:
void* data = /* result of computation */;
std::size_t dataSize = /* size of the result in bytes */;
std::string cacheFile = /* unique filename for this computation */;
std::ofstream out(cacheFile, std::ios::binary);
out << dataSize;
out.write(static_cast<const char *>(data), dataSize);
计算是确定性的,因此写入给定文件的数据将始终相同。
问题:多个线程(或进程)同时尝试此操作、相同的计算以及使用相同的输出文件是否安全?某些线程或进程是否无法写入文件并不重要,只要至少有一个成功,并且只要所有程序都处于有效状态即可。
在我运行的手动测试中,没有发生程序故障或数据损坏,并且始终使用正确的内容创建文件,但这可能与平台有关。作为参考,在我们的具体案例中,数据的大小范围为 2 到 50 KB。