powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_rwlock_t при большом количестве потоков не срабатывает
13 сообщений из 13, страница 1 из 1
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38113392
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;
            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
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114003
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114009
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987,

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

Там проще - читатель увеличивает счетчик а писатель будет ждать пока счетчик обнулится. получается дедлок если файл не открыт. Ну, зависит от системы. Не смотрел как это в линуксе.
...
Рейтинг: 0 / 0
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114104
Фотография 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
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114215
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114221
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCcAnatoly Moskovsky,

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

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

И кстати далеко не факт что шаред лок будет быстрее.
Особенно если операция записи быстрая.
...
Рейтинг: 0 / 0
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114269
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
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114326
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отменит предыдущуюOoCcВ варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Представь два потока 1 и 2 зашли одновременно и не нашли файл. очередность вызова блокировок чтения и записи не определена и в случае ниже будет классический дедлок.

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

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

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


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

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

До рекурсивных мютексов в посиксе я еще не дошел.
...
Рейтинг: 0 / 0
pthread_rwlock_t при большом количестве потоков не срабатывает
    #38114399
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, таки я ошибся, рекурсивность этого мьютекса это не стандартное поведение по 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
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_rwlock_t при большом количестве потоков не срабатывает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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