Как эффективно реализовать блокировку области файла, используя большую центральную диспетчеризацию? - PullRequest
0 голосов
/ 17 июля 2011

Для моего проекта я читаю и записываю в файл из нескольких потоков, поэтому мне нужно реализовать блокировку файла. Я пробовал fcntl(), однако кажется, что функция работает только с блокировкой между процессами, а не между потоками. Поэтому я ищу другое решение. Решение, которое я придумал (что, вероятно, не самое лучшее), состоит в том, чтобы в каждой записи в моем файле был байт, чтобы указать, заблокирована ли запись, и тогда я мог бы использовать цикл занятости для чтения и проверки байта. 1002 *

Итак, у меня два вопроса. Во-первых, каков наиболее эффективный способ блокировки файловых областей? Во-вторых, если я использую подход с занятым циклом, как я могу оптимизировать его с помощью центральной центральной диспетчеризации? Я думал, что смогу сделать так, чтобы все занятые циклы происходили в блоках, отправленных на dispatch_sync(). Но я не знаю, будет ли это работать эффективно.

Спасибо.

1 Ответ

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

Как насчет Отправка семафора ?Вы можете использовать диспетчерский семафор для доступа исключительно к ресурсам.Например, создайте семафоры отправки для ваших файловых областей.

for (int i = 0; i < regions; ++i)
    sema_[i] = dispatch_semaphore_create(1);

А затем получите доступ к ресурсам с ожиданием и сигналом.

dispatch_semaphore_wait(sema_[region], DISPATCH_TIME_FOREVER);
/* access the region */
dispatch_semaphore_signal(sema_[region]);
...