Задача: нужно создать кучу потоков, которые читают разделяемые данные. И есть один, который иногда (очень редко) меняет эти данные. Напрашивающееся решение: использовать rwlock. Это точно лучше, чем mutex. Но есть засада: при попытке получить rwlock на чтение может быть возвращена ошибка: достигнут предел на количество читателей.
Вопрос: как мне узнать заранее этот предел? Если я буду его знать, то у меня будут варианты: либо молча уменьшить макс. кол-во потоков до этой величины, либо сообщить юзеру, что я не могу обеспечить заданное им кол-во потоков, и завершиться после этого. Так как мне узнать (или задать) эту величину? Google даёт только ссылки либо на тот же man, который у меня и так есть, либо на пересказ этого же man’а своими словами с опечатками.
У меня программы должны работать десятилетиями, я не могу методом тыка определять такие величины: создавать потоки, лочить rwlock, затем при ошибке выдать сообщение о предельном кол-ве потоков, которое вбить гвоздями в программу. Сегодня это одна величина, а через 20 лет на другой версии GNU/linux она будет другой. Есть ли тут аналог sysconf(3)? Вот я могу запросить в run-time sysconf(_SC_OPEN_MAX). И исходя из этого не наступить на проблему, когда мне нужно держать открытыми много файлов одновременно.
А в случае POSIX threads вместо предсказуемого поведения программы мне предлагаются грабли. На которые я могу наступить в неизвестный мне заранее момент времени. Кто вообще писал такую спецификацию? Спек должен быть максимально конкретным, а не вот это вот расплывчатое, невнятное говно. Туда же до кучи: где мне получить величину PTHREAD_STACK_MIN? В man’е pthread_attr_setstacksize(3) она указана как 16384 байта (linux-specific). Я должен вбить гвоздями в программу константу 16384? Где, чёрт возьми, она за-define-нена? В pthread.h её нет. Ни sysconf(3), ни getrlimit(2) не дают её мне. Кто мне гарантирует, что через 10 лет она не изменится, и моя программа не перестанет работать? А где мне взять константу PTHREAD_THREADS_MAX, на которую ссылается man pthread_create(3p)?
Чем больше думаю на эту тему, тем меньше хочется использовать POSIX threads, а больше хочется заюзать напрямую clone(2). И получить предсказуемое поведение. И гори он огнём, этот POSIX с его невнятной спецификацией! Программа, написанная лет 20-25 назад с использованием linux-специфичного packet socket до сих пор работает и есть не просит.
Но всё-таки хочется же переносимости – по возможности. Может кто знает, где нарыть документацию на POSIX threads? Более внятную, чем тупо перепечатка man’ов на функции. И конкретно на rwlock: как получить (указать?) максимальное количество потоков-читателей? Opengroup не предлагать, там те же man’ы.

