pthreads rd/wr lock'и
От Nickita A Startcev (2:5030/777.319) к Dmitry E. Oboukhov
В ответ на Заголовок предыдущего сообщения в треде (Имя Автора)
Привет, Dmitry !
03 Jul 09 , 11:58 Dmitry E. Oboukhov писал к Nickita A Startcev:
NAS>> Зачем два разных лока?
NAS>> Алгоритм записи: лочим, пишем, разлочиваем
NAS>> Алгоритм чтения: лочим, читаем, разлочиваем
NAS>> В обоих случаях если залочить не удалось, то ничего не делаем, а
NAS>> ждём разлочивания.
DEO> при таком алгоритме производительность получается никакая
DEO> ибо читает или пишет строго один процесс.
Тогда, получается, у нас есть три состояния, между которыми надо переходить атомарно:
- свободно
- кто-то читает
- кто-то пишет.
соответственно, надо или атомарную двухбитовую переменную, или два каких-то мутекса.
Как вариант. Лочить мутексом глобальную целую "переменную", переводить ее в состояние
свободно(0), читает N+1 процесс(N+1), пишет кто-то (-1).
читатель:
1.лочим, смотрим, если можно читать - инкрементируем, разлочиваем.
2.читаем.
3.лочим, декрементируем, разлочиваем.
0. если залочено - то отваливаем.
0. если читать низзя (пишут) - то отваливаем каким-нибудь sleep(0).
Писатель:
1.лочим, смотрим. если 0 читателей, то переводим в состояние 'пишем', иначе отваливаем.
2. пишем
3. разлочиваем
Тут сложность: при частом чтении писатель может многократно обламываться на залочивании.
. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev
... проблемы шерифа волнуют индейцев
--- GoldED+/LNX 1.1.4.7
* Origin: Люди Билли не любили... (c) (2:5030/777.319)
Ответы на это письмо:
From: Username
Заголовок следующего сообщения в треде может быть длинным и его придется перенести на новую строку
From: Username
Или коротким