Предположим, что в программе имеется механизм кэширования, в котором в конце какого-либо конкретного вычисления c программа записывает вывод этого вычисления на диск, чтобы избежать его повторного вычисления позже, когда программа будет перезапущена. Это делается для большого числа вычислений и сохраняет каждый вывод в отдельных файлах (по одному на каждое вычисление, имена файлов определяются путем хеширования параметров вычислений). Данные записываются в файл со стандартными потоками 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);
Расчет является детерминированным c, поэтому данные, записанные в данный файл, всегда будут одинаковыми.
Вопрос : безопасно ли нескольким потокам (или процессам) делать это одновременно, для одного и того же вычисления и с одним и тем же выходным файлом? Не имеет значения, если некоторые потоки или процессы не могут записать файл, если хотя бы одна из них успешно выполняется, и пока все программы остаются в допустимом состоянии.
В ручных тестах, которые я запускал, нет Произошел сбой программы или повреждение данных, и файл всегда создавался с правильным содержимым, но это может зависеть от платформы. Для справки: в нашем конкретном случае c размер данных варьируется от 2 до 50 килобайт.