У нас есть приложение, которое пользователь может запустить для генерации данных по указанному пользователем пути. Эти уникальные выходные данные генерируются относительно одного уникального набора входных данных - эти входные данные предоставляются пользователем.
Когда мы первоначально разрабатывали приложение, мы никогда не ожидали, что количество уникальных входных наборов данных будет быть большим (из-за характера приложения). Мы ожидали, что количество уникальных входных наборов данных может быть порядка 10, в то время как у одного пользователя это число равно 1000. Итак, этот конкретный пользователь запустил 1000 заданий нашего приложения в сетке и все записывают данные по одному и тому же пути. Обратите внимание: эти 1000 заданий не запускаются из нашего приложения, а скорее он порождал 1000 процессов нашего приложения на разных машинах.
Теперь это привело к некоторому конфликту и потере данных. , Планирую синхронизацию с помощью boost :: interprocess. Это то, что я планирую:
// usual processing of input data ...
boost::filesystem::path reportLockFilePath(boost::filesystem::system_complete(userDir));
rerportLockFilePath.append("report.lock");
// if lock file does not exist, create one
if (!boost::filesystem::exists(reportLockFilePath) {
boost::interprocess::named_mutex reportLockMutex(boost::interprocess::open_or_create, "report_mutex");
boost::interprocess::scoped_lock< boost::interprocess::named_mutex > lock(reportLockMutex);
std::ofstream lockStrm(reportLockFilePath.string().c_str());
lockStrm << "## report lock file ##" << std::endl;
lockStrm.flush();
}
boost::interprocess::file_lock reportFileLock(reportLockFilePath.string().c_str());
boost::interprocess::scoped_lock< boost::interprocess::file_lock > lock(reportFileLock);
// usual reporting code that we already have ...
Теперь вопросов -
- Если это правильная синхронизация для решаемой проблемы
- Если эта схема синхронизации будет работать, когда задания находятся на разных машинах и путь указан в NFS
- Если на NFS et c., Это не сработает, каковы альтернативы C ++? Я предпочитаю избегать функций нижнего уровня C, чтобы избежать состояния гонки из-за блокировки, когда один экземпляр выполнения дает сбой и т. Д. c.