Я не могу сказать, что это было бы "оптимальным" решением, но я бы предложил что-то вроде этого:
Поддерживать связанный список структуры, которая содержит две вещи:
- Имя файла
- Переменная ожидания состояния, связанная с файлом.
Поток A. Когда демон получает запрос, мьютекс блокирует список и проверяет, находится ли имя файла в списке или нет.Если это не так, добавьте новую запись в связанный список с новой переменной условия ожидания для использования другими потоками.Отпустите блокировку мьютекса.Выполните файловую операцию.После завершения заблокируйте связанный список и удалите запись структуры для этого файла, а затем сообщите другим потокам через объект ожидания.
Поток B. Если поступит запрос для того же файла, он заблокируетсписок и найдите имя файла, содержащегося в списке.Если он есть в списке, возьмите переменную wait и дождитесь ее.Когда потоку сообщается, захватите блокировку в списке и посмотрите, есть ли файл в списке (возможно, другой поток установил блокировку имени файла перед вами).Если нет, следуйте за потоком A. Если это так, возьмите переменную ожидания в новой структуре и подождите снова, пока не будет получен сигнал, затем снова выполните вышеуказанные шаги.