Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Добрый день, вычитал про pthread_rwlock_t мьютексы, то что мне и надо редкая запись но частое считывание, итак код : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. смысл его в следущем есть мэп, в которую я записываю имя файла и его дескриптор,(была ошибка много открытых файлов,а открывался один и тот же), но при работе данного кода в ветку else я попадаю но потом или дедлок или они все дружно пролитают и я так и не успеваю чтото добавить в мэп.Вообще как надо строить код с pthread_rwlock_t мюьтексами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 10:24 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, Каждому вызову pthread_rwlock_rdlock и pthread_rwlock_wrlock должен соответствовать вызов pthread_rwlock_unlock. Причем pthread_rwlock_unlock сначала освобождает rwlock-и на мьютексе, и если их нет - тогда уже readlock-и. Т.е. схема такая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. А у вас только один unlock отсюда и дедлоки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:32 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, Ты неможешь быть читателем и писателем одновременно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:33 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Там проще - читатель увеличивает счетчик а писатель будет ждать пока счетчик обнулится. получается дедлок если файл не открыт. Ну, зависит от системы. Не смотрел как это в линуксе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:37 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
В варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Представь два потока 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. смысл его в следущем есть мэп, в которую я записываю имя файла и его дескриптор,(была ошибка много открытых файлов,а открывался один и тот же), но при работе данного кода в ветку else я попадаю но потом или дедлок или они все дружно пролитают и я так и не успеваю чтото добавить в мэп.Вообще как надо строить код с pthread_rwlock_t мюьтексами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 15:13 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
OoCcВ варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Хорошо тогда код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. получается не прокатит, какие еще есть возможности решение такой задачи, потому что запись будет очерь редка и ставить скопед мютекс мне жалко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 16:14 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
OoCcAnatoly Moskovsky, Там проще - читатель увеличивает счетчик а писатель будет ждать пока счетчик обнулится. получается дедлок если файл не открыт. Ну, зависит от системы. Не смотрел как это в линуксе. Конкретно именно этот мьютекс при блокировке по записи ждет пока ридеры/райтеры других потоков не уйдут. Это значит что ридер текущего потока не мешает применить блокировку записи. http://linux.die.net/man/3/pthread_rwlock_wrlock. Ну и этот мьютекс рекурсивный, т.е. допускает вложенные блокировки в одном потоке. (Это не только линкусовое, а вообще posix) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 16:16 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Katamaran1987получается не прокатит В пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 16:18 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Katamaran1987 запись будет очерь редка и ставить скопед мютекс мне жалко. На самом деле POSIX разрешает реализациям внутри все делать через обычные эксклюзивные локи. Семантически это эквивалентно. И кстати далеко не факт что шаред лок будет быстрее. Особенно если операция записи быстрая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 16:21 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
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. смысл его в следущем есть мэп, в которую я записываю имя файла и его дескриптор,(была ошибка много открытых файлов,а открывался один и тот же), но при работе данного кода в ветку else я попадаю но потом или дедлок или они все дружно пролитают и я так и не успеваю чтото добавить в мэп.Вообще как надо строить код с pthread_rwlock_t мюьтексами? Разве блокировка на запись сама по себе не отменит предыдущую блокировку на чтение? Насколько помню в бусте именно так и происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 16:46 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
отменит предыдущуюOoCcВ варианте имплементации допускающей поток как читателя и писателя одновременно всеравно будут дедлоки. Представь два потока 1 и 2 зашли одновременно и не нашли файл. очередность вызова блокировок чтения и записи не определена и в случае ниже будет классический дедлок. пропущено... Разве блокировка на запись сама по себе не отменит предыдущую блокировку на чтение? Насколько помню в бусте именно так и происходит. Может - сильно зависит от имплементации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 17:14 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyOoCcAnatoly Moskovsky, Там проще - читатель увеличивает счетчик а писатель будет ждать пока счетчик обнулится. получается дедлок если файл не открыт. Ну, зависит от системы. Не смотрел как это в линуксе. Конкретно именно этот мьютекс при блокировке по записи ждет пока ридеры/райтеры других потоков не уйдут. Это значит что ридер текущего потока не мешает применить блокировку записи. http://linux.die.net/man/3/pthread_rwlock_wrlock. Я только описал идею - все остальное сильно зависит от имплементации. в данном случае нужно смотреть glibc Anatoly MoskovskyНу и этот мьютекс рекурсивный, т.е. допускает вложенные блокировки в одном потоке. (Это не только линкусовое, а вообще posix) До рекурсивных мютексов в посиксе я еще не дошел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 17:52 |
|
||
|
pthread_rwlock_t при большом количестве потоков не срабатывает
|
|||
|---|---|---|---|
|
#18+
Да, таки я ошибся, рекурсивность этого мьютекса это не стандартное поведение по POSIX ссылка . Это значит и в линуксе в любой момент могут изменить это. Тогда схема такая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 17:57 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38114215&tid=2020515]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 277ms |
| total: | 538ms |

| 0 / 0 |
