Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_rwlock_t при большом количестве потоков не срабатывает / 13 сообщений из 13, страница 1 из 1
17.01.2013, 10:24
    #38113392
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Добрый день, вычитал про pthread_rwlock_t мьютексы, то что мне и надо редкая запись но частое считывание, итак код :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
void routine()
{
            int src = -1;
            pthread_rwlock_rdlock(&rw_mutex_);
            auto finded = opened_files.find(full_path);
            if(finded!=opened_files.end())
            {
                 src = (*finded).second;
            }
            else
            {
                pthread_rwlock_wrlock(&rw_mutex_);
                if((src = open(full_path.c_str(), O_RDONLY)) !=-1)
                {
                    opened_files[full_path] = src;
                }
            }
            pthread_rwlock_unlock(&rw_mutex_);
}

смысл его в следущем есть мэп, в которую я записываю имя файла и его дескриптор,(была ошибка много открытых файлов,а открывался один и тот же), но при работе данного кода в ветку else я попадаю но потом или дедлок или они все дружно пролитают и я так и не успеваю чтото добавить в мэп.Вообще как надо строить код с pthread_rwlock_t мюьтексами?
...
Рейтинг: 0 / 0
17.01.2013, 14:32
    #38114003
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Katamaran1987,

Каждому вызову pthread_rwlock_rdlock и pthread_rwlock_wrlock должен соответствовать вызов pthread_rwlock_unlock.
Причем pthread_rwlock_unlock сначала освобождает rwlock-и на мьютексе, и если их нет - тогда уже readlock-и.

Т.е. схема такая:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
readlock
find key
if not found
   write lock
   create key
   unlock
end
unlock



А у вас только один unlock отсюда и дедлоки
...
Рейтинг: 0 / 0
17.01.2013, 14:33
    #38114009
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Katamaran1987,

Ты неможешь быть читателем и писателем одновременно.
...
Рейтинг: 0 / 0
17.01.2013, 14:37
    #38114013
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Anatoly Moskovsky,

Там проще - читатель увеличивает счетчик а писатель будет ждать пока счетчик обнулится. получается дедлок если файл не открыт. Ну, зависит от системы. Не смотрел как это в линуксе.
...
Рейтинг: 0 / 0
17.01.2013, 15:13
    #38114104
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
В варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Представь два потока 1 и 2 зашли одновременно и не нашли файл. очередность вызова блокировок чтения и записи не определена и в случае ниже будет классический дедлок.

Katamaran1987Добрый день, вычитал про pthread_rwlock_t мьютексы, то что мне и надо редкая запись но частое считывание, итак код :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
void routine()
{
            int src = -1;
1,2            pthread_rwlock_rdlock(&rw_mutex_);
            auto finded = opened_files.find(full_path);
            if(finded!=opened_files.end())
            {
                 src = (*finded).second;
            }
            else
            {
 2,1                pthread_rwlock_wrlock(&rw_mutex_);
                if((src = open(full_path.c_str(), O_RDONLY)) !=-1)
                {
                    opened_files[full_path] = src;
                }
            }
            pthread_rwlock_unlock(&rw_mutex_);
}

смысл его в следущем есть мэп, в которую я записываю имя файла и его дескриптор,(была ошибка много открытых файлов,а открывался один и тот же), но при работе данного кода в ветку else я попадаю но потом или дедлок или они все дружно пролитают и я так и не успеваю чтото добавить в мэп.Вообще как надо строить код с pthread_rwlock_t мюьтексами?
...
Рейтинг: 0 / 0
17.01.2013, 16:14
    #38114215
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
OoCcВ варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Хорошо тогда код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void routine()
{
            int src = -1;
            pthread_rwlock_rdlock(&rw_mutex_);
            auto finded = opened_files.find(full_path);
            if(finded!=opened_files.end())
            {
                 src = (*finded).second;
            }
            else
            {
                if((src = open(full_path.c_str(), O_RDONLY)) !=-1)
                {
                    pthread_rwlock_wrlock(&rw_mutex_);
                    opened_files[full_path] = src;
                    pthread_rwlock_unlock(&rw_mutex_);
                }
            }
            pthread_rwlock_unlock(&rw_mutex_);
}

получается не прокатит, какие еще есть возможности решение такой задачи, потому что запись будет очерь редка и ставить скопед мютекс мне жалко.
...
Рейтинг: 0 / 0
17.01.2013, 16:16
    #38114221
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
OoCcAnatoly Moskovsky,

Там проще - читатель увеличивает счетчик а писатель будет ждать пока счетчик обнулится. получается дедлок если файл не открыт. Ну, зависит от системы. Не смотрел как это в линуксе.
Конкретно именно этот мьютекс при блокировке по записи ждет пока ридеры/райтеры других потоков не уйдут.
Это значит что ридер текущего потока не мешает применить блокировку записи.
http://linux.die.net/man/3/pthread_rwlock_wrlock.
Ну и этот мьютекс рекурсивный, т.е. допускает вложенные блокировки в одном потоке.

(Это не только линкусовое, а вообще posix)
...
Рейтинг: 0 / 0
17.01.2013, 16:18
    #38114226
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Katamaran1987получается не прокатит
В пробовали?
...
Рейтинг: 0 / 0
17.01.2013, 16:21
    #38114237
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Katamaran1987 запись будет очерь редка и ставить скопед мютекс мне жалко.
На самом деле POSIX разрешает реализациям внутри все делать через обычные эксклюзивные локи.
Семантически это эквивалентно.

И кстати далеко не факт что шаред лок будет быстрее.
Особенно если операция записи быстрая.
...
Рейтинг: 0 / 0
17.01.2013, 16:46
    #38114269
pthread_rwlock_t при большом количестве потоков не срабатывает
OoCcВ варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Представь два потока 1 и 2 зашли одновременно и не нашли файл. очередность вызова блокировок чтения и записи не определена и в случае ниже будет классический дедлок.

Katamaran1987Добрый день, вычитал про pthread_rwlock_t мьютексы, то что мне и надо редкая запись но частое считывание, итак код :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
void routine()
{
            int src = -1;
1,2            pthread_rwlock_rdlock(&rw_mutex_);
            auto finded = opened_files.find(full_path);
            if(finded!=opened_files.end())
            {
                 src = (*finded).second;
            }
            else
            {
 2,1                pthread_rwlock_wrlock(&rw_mutex_);
                if((src = open(full_path.c_str(), O_RDONLY)) !=-1)
                {
                    opened_files[full_path] = src;
                }
            }
            pthread_rwlock_unlock(&rw_mutex_);
}

смысл его в следущем есть мэп, в которую я записываю имя файла и его дескриптор,(была ошибка много открытых файлов,а открывался один и тот же), но при работе данного кода в ветку else я попадаю но потом или дедлок или они все дружно пролитают и я так и не успеваю чтото добавить в мэп.Вообще как надо строить код с pthread_rwlock_t мюьтексами?
Разве блокировка на запись сама по себе не отменит предыдущую блокировку на чтение?
Насколько помню в бусте именно так и происходит.
...
Рейтинг: 0 / 0
17.01.2013, 17:14
    #38114326
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
отменит предыдущуюOoCcВ варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Представь два потока 1 и 2 зашли одновременно и не нашли файл. очередность вызова блокировок чтения и записи не определена и в случае ниже будет классический дедлок.

пропущено...

Разве блокировка на запись сама по себе не отменит предыдущую блокировку на чтение?
Насколько помню в бусте именно так и происходит.
Может - сильно зависит от имплементации.
...
Рейтинг: 0 / 0
17.01.2013, 17:52
    #38114388
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Anatoly MoskovskyOoCcAnatoly Moskovsky,

Там проще - читатель увеличивает счетчик а писатель будет ждать пока счетчик обнулится. получается дедлок если файл не открыт. Ну, зависит от системы. Не смотрел как это в линуксе.
Конкретно именно этот мьютекс при блокировке по записи ждет пока ридеры/райтеры других потоков не уйдут.
Это значит что ридер текущего потока не мешает применить блокировку записи.
http://linux.die.net/man/3/pthread_rwlock_wrlock.


Я только описал идею - все остальное сильно зависит от имплементации. в данном случае нужно смотреть glibc

Anatoly MoskovskyНу и этот мьютекс рекурсивный, т.е. допускает вложенные блокировки в одном потоке.
(Это не только линкусовое, а вообще posix)

До рекурсивных мютексов в посиксе я еще не дошел.
...
Рейтинг: 0 / 0
17.01.2013, 17:57
    #38114399
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_rwlock_t при большом количестве потоков не срабатывает
Да, таки я ошибся, рекурсивность этого мьютекса это не стандартное поведение по POSIX ссылка .
Это значит и в линуксе в любой момент могут изменить это.

Тогда схема такая:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
readlock
find key
unlock
if not found
   writelock
   find key
   if not found 
       create key
   end 
   unlock
end
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_rwlock_t при большом количестве потоков не срабатывает / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]