The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Особый mutex"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Процессы, Треды, RPC)
Изначальное сообщение [ Отслеживать ]

"Особый mutex"  +/
Сообщение от Аноним (??) on 25-Янв-10, 20:41 
Код на С, есть массив, который иногда (редко) может динамически обновлятся
спецальным потоком. Другие потоки только читают из этого массива. Сейчас
все организовано простым mutex-ом, примерно так:


refresh.c:
...
pthread_mutex_lock(mutex);
refresh(my_array);
pthread_mutex_unlock(mutex);
...

readers.c:
...
pthread_mutex_lock(mutex);
index = binary_search(val, my_array, my_array_size);
pthread_mutex_unlock(mutex);
...

Но так не оптимально, каждый читатель блокирует других читателей, нужно
чтобы читатели друг друга не блокировали, а блокировали только писателя,
а писатель пускай блокирует всех. Как этого добиться? Спасибо!

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Особый mutex"  +/
Сообщение от Аноним (??) on 25-Янв-10, 21:13 
Покурил маны :) Нашел то что нужно:

pthread_rwlock_wrlock, pthread_rwlock_rdlock и их друзья..

Вопрос наверно закрыт, но если у вас есть предложение лучше чем это, тогда буду рад узнать и о нем :)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Особый mutex"  +/
Сообщение от nuclearcat on 26-Янв-10, 08:37 
>Покурил маны :) Нашел то что нужно:
>
>pthread_rwlock_wrlock, pthread_rwlock_rdlock и их друзья..
>
>Вопрос наверно закрыт, но если у вас есть предложение лучше чем это,
>тогда буду рад узнать и о нем :)

Почитайте еще о RCU (Read-Copy-Update)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Особый mutex"  +/
Сообщение от Аноним (??) on 26-Янв-10, 20:28 
>Почитайте еще о RCU (Read-Copy-Update)

Спасибо, нашел библиотеку "Userspace RCU library" (liburcu)

http://lwn.net/Articles/262464/
http://www.lttng.org/files/urcu/

Попробую разобраться в превосходствах на методом с pthread_


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Особый mutex"  +/
Сообщение от vvvua (ok) on 29-Янв-10, 17:21 
По-моему, если не писать под Альфу то всё будет ОК и без этой либы...


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Особый mutex"  +/
Сообщение от аноним on 29-Янв-10, 18:34 
>Код на С, есть массив, который иногда (редко) может динамически обновлятся
>спецальным потоком. Другие потоки только читают из этого массива. Сейчас
>все организовано простым mutex-ом, примерно так:

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

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

Кстати, напомните - даются ли в C какие-то гарантии по поводу атомарности операций икремента/декремента int и присвоения указателя? Если нет, то как их реализовать портабельно? Понятно, что можно обернуть в mutex'ы, но хочется менее криво и более эффективно на платформах где это возможно.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Особый mutex"  +/
Сообщение от Аноним_ТопикСтартер on 29-Янв-10, 18:55 
>
>Остается вопрос, когда удалить старый массив - нужно дождаться, чтобы его отпустили
>все читающие потоки, что можно сделать атомарным же счетчиком, который периодически
>проверять пишущим потоком и в случае обнуления удалять старый массив.
>

покомментирую позже, когда буду дома

>Кстати, напомните - даются ли в C какие-то гарантии по поводу атомарности
>операций икремента/декремента int и присвоения указателя? Если нет, то как их
>реализовать портабельно? Понятно, что можно обернуть в mutex'ы, но хочется менее
>криво и более эффективно на платформах где это возможно.

В gnu libc есть специальный atomic тип sig_atomic_t, есть ли он в C99, нужно проверить, вот:

http://www.gnu.org/s/libc/manual/html_node/Atomic-Types.html

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Особый mutex"  +/
Сообщение от Wulf (??) on 28-Июн-10, 23:52 
>Кстати, напомните - даются ли в C какие-то гарантии по поводу атомарности
>операций икремента/декремента int

Не даются
> и присвоения указателя?

Это атомарно
> Если нет, то как их
>реализовать портабельно? Понятно, что можно обернуть в mutex'ы, но хочется менее
>криво и более эффективно на платформах где это возможно.

В glib-е, например, есть атомарные операции

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Особый mutex"  –1 +/
Сообщение от Cris email on 28-Июн-10, 11:52 
>[оверквотинг удален]
>readers.c:
>...
>pthread_mutex_lock(mutex);
>index = binary_search(val, my_array, my_array_size);
>pthread_mutex_unlock(mutex);
>...
>
>Но так не оптимально, каждый читатель блокирует других читателей, нужно
>чтобы читатели друг друга не блокировали, а блокировали только писателя,
>а писатель пускай блокирует всех. Как этого добиться? Спасибо!

это называется семафор

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру