Я пишу программу синхронизирующую содержимое папок на диске. Для того, чтобы исключить одновременный доступ нескольких экземпляров программы к одной папке, я создаю lock-файл. Если при обращении к директории программа видит там lock файл, то это означает, что с этой директорией уже кто-то работает и она не будет работать с этой директорией, а будет ждать пока lock файл не будет удалён.
Меня беспокоит такой вопрос: теоретически возможна ситуация, когда мы проверяем наличия файла на диске и видим, что его нет и создаём его сами, но в промежутке времени между проверкой и созданием файла он был создан другим экземпляром программы. В результате две программы уверены, что они владеют содержимым папки и будут изменять его одновременно не догадываясь об этом.
Как можно было бы исключить эту ситуацию? Или эта ситуация невозможна?
Использовать для решения функции специфичные для конкретных ОС нежелательно, так как общая папка может быть, например, сетевым диском WebDav или чем нибудь подобным.
А чтобы опоздавшая программа не думала, что ей что-то можно делать, нужна проверка, при создании файла, если создание завершилось ошибкой, перепроверить, вдруг кто-то другой создал, а полезную работу выполнять, только если функция создания файла завершилась без ошибки. Тогда накладки не будет.
Еще можно в файле id экземпляра программы прописывать и сверять. Твой не твой, а id генерировать при запуске экземпляра случайно.
При открытии файла fopen с режимом "x" если файл существует - будет возвращена ошибка.
Соответственно спокойно открываешь файл, если вернулась ошибка, ждешь и повторяешь попытки в цикле, если открылся - тут же закрываешь и работаешь с директорией, по окончанию работы файл удаляешь. Обе операции атомарные.