на главнуюВсе эхи RU.CPP
войти ?

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
Или коротким

FGHI-url этого письма: area://RU.CPP?msgid=2:5030/777.319+4a4e17fd