Как я могу синхронизировать два процесса, получающие доступ к файлу на NAS?

С помощью nodes[_node]; вы получаете элемент массива graph, поэтому вы получаете тип graph. Однако вы назначаете этот элемент указателю типа struct graph *start.

Таким образом, строка должна быть:

struct graph *start = &nodes[_node];

Я не понимаю, почему вы не хотите этого делать, но если это так, вы можете попробовать:

struct graph start = nodes[_node];
5
задан Luc Touraille 23 January 2009 в 09:19
поделиться

5 ответов

Вы могли создать файл блокировки на сервере, который создается, прежде чем Вы будете делать запись, будете ожидать затем запись и будете удалять на завершении., Имейте проверку процесса считывания на маркер прежде, чем считать файл.

Править: Для обращения к комментариям можно реализовать перепроверяемый шаблон типа блокировки. Имейте и средство чтения и устройство записи, имеют файл блокировки и двойную проверку перед работой, что-то как:

Читатель: Проверьте на файл блокировки записи, создайте файл блокировки чтения, проверьте на файл блокировки записи, если существует, удаляют файл чтения и аварийное прекращение работы.

Устройство записи: Проверьте на файл блокировки чтения, создайте файл блокировки записи, проверьте на файл блокировки чтения, если существует, удаляют файл блокировки записи и аварийное прекращение работы.

Это остановит Ваши процессы, топчущие друг друга, но потенциальное состояние состязания может произойти, в котором Вы могли потенциально иметь обе проверки процессов, создать затем перепроверку одновременно, хотя это не заставит данные быть считанными в непоследовательном состоянии, но заставит и процессы считывания и процессы записи прерываться для Вашей указанной задержки

8
ответ дан 18 December 2019 в 09:54
поделиться

Спасибо всем за Ваши ответы.

Наконец нам удалось разрешить нашу проблему, не при помощи блокировки команд ОС (потому что мы не были уверены, что они распространят правильно к ОС главы NAS), но путем создания каталогов блокировки вместо файлов блокировки. Создание каталога является атомарной операцией и возвращает ошибочное значение, если папка уже существует. Поэтому мы не должны проверять существование блокировки прежде, чем получить его, обе операции сделаны в одноэтапном.

5
ответ дан 18 December 2019 в 09:54
поделиться

Если файлы находятся на доле NFS, можно использовать fcntl (2) для блокировки файла. Проверьте вопрос D10 в NFS Linux FAQ. У меня есть очень мало опыта с окнами API, но от того, что я услышал, что у них есть хорошая поддержка POSIX, таким образом, необходимо смочь использовать fcntl, пока они поддерживают POSIX.1-2001.

При доступе к файлам с помощью различных протоколов (т.е. AFS или SMB), возможно, Вы могли настроить простой сервер синхронизации, который управляет блокировками через интерфейс IPC?

1
ответ дан 18 December 2019 в 09:54
поделиться

Хорошо Вам нужна некоторая форма блокировки механизма для управления доступами.

Большинство *отклоняет Файловые системы, обеспечивают это. Я подозреваю, что это также доступно в Windows File System (поскольку этот механизм используется жемчугом), но это может иметь другое имя.

Смотрите на скопление ().
Это - механизм захвата файла. Это - консультативная блокировка, таким образом, это на самом деле не блокирует файл и предотвращает использование, но это обеспечивает механизм для маркировки файла. Если оба приложения используют механизм затем, можно управлять доступами к файлу.

скопление () обеспечивает обе коллективных блокировки (или СЧИТАЙТЕ Блокировку), и монопольные блокировки (или Блокировка ЗАПИСИ). скопление заблокирует Ваш поток (не занятым способом), пока файл не был разблокирован пользователем (оно также обеспечивает не блокирующиеся проверки, таким образом, можно сделать другие вещи при ожидании).

Скопление выезда в разделе 2 из страниц справочника.

int     flock(int fd, int operation);

Flock() applies or removes an advisory lock on the file associated with the file
descriptor fd.  A lock is applied by specifying an operation parameter that is
one of LOCK_SH or LOCK_EX with the optional addition of LOCK_NB.  To unlock an
existing lock operation should be LOCK_UN.
2
ответ дан 18 December 2019 в 09:54
поделиться

Было бы возможно переключиться от файлов до базы данных?

Этот тип параллелизма - что-то, чем DBMSs управляют очень хорошо. Это должно не быть дорогим или трудным установить. MySql, Postgress или JavaDB все обработали бы это изящно по минимальной стоимости.

При сбое параметра базы данных я имел бы запись записи к "скрытому" имени файла как ".updateinprogress.xml" и переименовал бы файл, когда обновление завершено. В большинстве систем "mv" или "ren" атомарная операция так процесс считывания или берет hte старый файл или более новый файл, но никогда половину записанного.

1
ответ дан 18 December 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: