Я не думаю, что вы можете достичь своей цели с помощью одного мьютекса, но вы можете довольно легко использовать два мьютекса, чтобы убедиться, что ни один процесс никогда не записывает дважды в последовательности. Вам нужно всегда иметь один процесс в очереди ожидания и один процесс в состоянии записи. Для этого вы создаете два мьютекса, назовем их queueMutex
и writeMutex
. Логика итерации в псевдокоде должна выглядеть следующим образом:
acquire(queueMutex) // The process is next to write
acquire(writeMutex) // The process can now write
release(queueMutex) // Some other process can enter the queue
// now we can write
write_to_file()
// Let's hold on here until some other process
// enters the queue
// we do it by trying to acquire the queueMutex
// until the acquisition fails
while try_acquire(queueMutex)
release(queueMutex)
sleep
// try_acquire(queueMutex) finally failed
// this means some other process has entered the queue
// we can release the writeMutex and finish this iteration
release(writeMutex)
Я оставлю детали реализации до вас. При реализации алгоритма убедитесь, что вы правильно обрабатываете последнюю итерацию для последнего процесса, иначе он зависнет. Удачи!