Что действительно делает _locking ()? - PullRequest
5 голосов
/ 27 июля 2011

Ищу ответ на этот вопрос Я нашел функцию _locking () .Там говорится, что это Locks or unlocks bytes of a file (на самом деле я не могу понять, что на самом деле означает это предложение).Если у кого-то есть опыт использования этой функции, возможно ли использовать функцию для решения проблемы, описанной в первом вопросе?

Ответы [ 4 ]

1 голос
/ 27 июля 2011

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

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

Но процессы по-прежнему могут обращаться к другим частям файла без ошибок или задержек.

Это не решит проблему в вопросе, на который вы ссылаетесь, потому что _lock() on; t работает с гранулярностью процесса. Если поток A блокирует диапазон файлов, то поток B в том же процессе все еще может читать / записывать этот диапазон. Чтобы предотвратить доступ другого потока в том же процессе к диапазону файлов, процесс должен будет реализовать собственный внутренний механизм, обеспечивающий блокировку диапазона файлов другим потоком. По крайней мере, я ничего не знаю о том, что делает это в Win32 API (я полагаю, что может быть что-то, о чем я не знаю).

1 голос
/ 27 июля 2011

Цитирование страницы MSDN, на которую вы ссылались:

int _locking(
   int fd,
   int mode,
   long nbytes 
);

Функция _locking блокирует или разблокирует nbytes байт файла, указанного fd Блокировка байтов в файле предотвращает доступ к этим байтам другими процессами. Вся блокировка или разблокировка начинается с текущей позиции указателя файла и продолжается для следующих nbytes байтов. Можно заблокировать байты за концом файла.

0 голосов
/ 27 июля 2011

Запрещает другим процессам обращаться к той же части файла.

0 голосов
/ 27 июля 2011

http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx

Я обнаружил, что это помогает "исправить" проблему Состояние гонки !

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

Таким образом, вы берете размер файла в байтах, передаете его в эту функцию, а затем блокируете его.

Функция вернет 0 в случае успеха.Возвращаемое значение –1 указывает на ошибку, в этом случае значение errno устанавливается на то, что говорит страница MSDN.

Чтобы ответить на ваш вопрос

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

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

...