Я пишу приложение, которое требует, чтобы определенные действия для данного пользователя не топтались потенциально конкурирующими потоками. Вся моя база данных пользователя находится в памяти, и я думал о добавлении pthread_rwlock_t
к структуре пользовательских данных. Я не ожидаю более 10-20 тысяч пользователей. В 56 байт для структуры блокировки, которая не так много ОЗУ. Мой вопрос в том, есть ли практическое ограничение количества фактических rwlocks, которые вы можете иметь в процессе? Обратите внимание, что я НЕ говорю о количестве потоков, которые могут получить блокировку, или количество раз, когда данный поток может увеличивать счетчик блокировок. Скорее, мне интересно, есть ли какое-то основное ядро или другой ресурс, который поддерживает каждый отдельный замок, который я могу исчерпать.Практическое ограничение на количество pwreads rwlocks?
0
A
ответ
2
Это проблема с качеством реализации: POSIX позволяет инициализировать rwlock сбой из-за исчерпания ресурсов. Однако, например, для обычных реализаций Linux не требуются ресурсы для блокировки, отличные от памяти для самого pthread_rwlock_t
.
«Обычные реализации Linux, например, не требуют каких-либо ресурсов для блокировки, кроме памяти для самого pthread_rwlock_t». не так ли? Нам не нужна память для хранения pthread_rwlock_t; но есть lll_futex_wait с syscall futex в методах rwlock, таких как http://osxr.org:8080/glibc/source/nptl/pthread_rwlock_rdlock.c#0030. Верно ли, что futex не требует каких-либо ресурсов, когда есть официант или официанты? Официанты должны быть сохранены в ядре в некотором списке или другой структуре данных. – osgx
@osgx: Это не ресурс для блокировки, это ресурс для каждого официанта. – caf
Спасибо. Для этого конкретного приложения мне почти наверняка никогда не понадобится ничего, кроме современной Linux, но полезно знать, что существует, по крайней мере, _potential_, для чего требуются ресурсы, которые могут быть исчерпаны. Я могу добавить много комментариев к этому эффекту в коде, если он когда-либо понадобится портировать в другом месте. – Kean