#c #multithreading #rwlock
#c #многопоточность #rwlock
Вопрос:
При попытке реализовать команду, аналогичную команде перемещения в Linux, для другой файловой системы, которая должна быть многопоточной, у меня возникает следующая проблема.
Когда я пытаюсь сделать: «‘mv / a / b / a»‘ программа блокирует корневой каталог для записи и a для записи. Затем, поскольку я не могу снять блокировки, потому что другой поток может их получить, я попадаю в тупиковую ситуацию, когда пытаюсь заблокировать корень для чтения в пункте назначения команды перемещения.
Я пытаюсь разобраться в возможном решении этой проблемы. В том виде, в котором сейчас находится мой код, при задании пути /x / y / z он блокирует каждый каталог для чтения или записи, в зависимости от команды, которую я хочу выполнить. Итак, используя это, я могу определить, могу ли я записать /a в /b / a , потому что он проверяет, существует ли /a и не существует ли /b / a , но мне все еще нужно обойти ситуацию взаимоблокировки.
Комментарии:
1. Как насчет: если блокировка уже заблокирована, не блокируйте ее снова? Или используйте рекурсивную блокировку, где это нормально.
2. попробуйте использовать
poll
3. @АлексейНеудачин что вы подразумеваете под опросом? Это файловая система, которая будет работать в файле .txt. Это не «реально», скажем. Конечно, я мог бы приписать дескриптор каждому файлу, но разве нет более простого решения?
4. @user253751 Я делаю это. Проблема в том, что если блокировка заблокирована для записи первой, я не могу заблокировать ее для чтения, и поскольку я не могу ее заблокировать, я не могу просто заставить свой поток застрять там, я полагаю, верно?
5.
OF_SHARE_EXCLUSIVE
в Windows есть флаг. learn.microsoft.com/en-us/windows/win32/api/winbase /… . idk unix-материал по этому поводу.