两个线程将相同的内容写入同一个文件是否安全?
Is it safe for two threads to write identical content to the same file?
假设一个程序有一个缓存机制,在某些特定计算结束时,程序将该计算的输出写入磁盘以避免以后重新计算它,当程序重新运行.它为大量计算这样做,并将每个输出保存到单独的文件(每个计算一个,文件名由计算参数的散列确定)。数据使用标准 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);
计算是确定性的,因此写入给定文件的数据将始终相同。
问题:多个线程(或进程)同时尝试此操作、进行相同的计算并使用相同的输出文件是否安全?某些线程或进程是否无法写入文件并不重要,只要至少有一个成功,并且只要所有程序都处于有效状态即可。
在我 运行 的手动测试中,没有发生程序故障或数据损坏,并且始终使用正确的内容创建文件,但这可能取决于平台。作为参考,在我们的特定案例中,数据的大小 运行ges 从 2 到 50 KB。
is it safe for multiple threads (or processes) to attempt this simultaneously, for the same calculation, and with the same output file?
当多个线程尝试写入同一个文件时,这是一种竞争条件,因此您最终可能会得到损坏的文件。不能保证 ofstream::write
是原子的,这取决于特定的文件系统。
针对您的问题的可靠解决方案(适用于多线程 and/or 进程):
可以使用线程同步同步同一进程中的线程以写入一个文件。但是,这在不同进程之间是不可能的,所以最好避免它。 C++ 标准库中没有任何东西可供您使用。
操作系统确实提供了用于锁定保证原子性的文件的特殊功能(如 Windows 上的 lockf on Linux or LockFile(Ex))。你可能想看看它们。
假设一个程序有一个缓存机制,在某些特定计算结束时,程序将该计算的输出写入磁盘以避免以后重新计算它,当程序重新运行.它为大量计算这样做,并将每个输出保存到单独的文件(每个计算一个,文件名由计算参数的散列确定)。数据使用标准 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);
计算是确定性的,因此写入给定文件的数据将始终相同。
问题:多个线程(或进程)同时尝试此操作、进行相同的计算并使用相同的输出文件是否安全?某些线程或进程是否无法写入文件并不重要,只要至少有一个成功,并且只要所有程序都处于有效状态即可。
在我 运行 的手动测试中,没有发生程序故障或数据损坏,并且始终使用正确的内容创建文件,但这可能取决于平台。作为参考,在我们的特定案例中,数据的大小 运行ges 从 2 到 50 KB。
is it safe for multiple threads (or processes) to attempt this simultaneously, for the same calculation, and with the same output file?
当多个线程尝试写入同一个文件时,这是一种竞争条件,因此您最终可能会得到损坏的文件。不能保证 ofstream::write
是原子的,这取决于特定的文件系统。
针对您的问题的可靠解决方案(适用于多线程 and/or 进程):
可以使用线程同步同步同一进程中的线程以写入一个文件。但是,这在不同进程之间是不可能的,所以最好避免它。 C++ 标准库中没有任何东西可供您使用。
操作系统确实提供了用于锁定保证原子性的文件的特殊功能(如 Windows 上的 lockf on Linux or LockFile(Ex))。你可能想看看它们。