LINUX.ORG.RU

Posix threads: rwlock

 posix threads


0

3

Задача: нужно создать кучу потоков, которые читают разделяемые данные. И есть один, который иногда (очень редко) меняет эти данные. Напрашивающееся решение: использовать 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’ы.

★★
Ответ на: комментарий от r--r--r--

Ты второй раз отвечаешь на пост, но не отвечаешь на вопрос.

мальчик, а к тебе вообще тут никто не обращался. Ты не ТС, ответы были ни к тебе, твои комментарии тоже не в тему и стартеру не помогают никак. По доброте душевной я тебе ответил.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

По доброте душевной я тебе ответил.

А если бы ты, девочка, ещё бы умела себя вести в приличном обществе и не щитпостить FUD’ом в интернетах - цены бы тебе не было.

r--r--r--
()
Ответ на: комментарий от vbr

Что означает эта фраза? Там по-любому будет какая-то очередь для этих запросов. А значит будет многопоточная структура данных для реализации этой очереди. И ты просто заменил простой многопоточный примитив сложным. Можно, а зачем?

Представим раннее утро. На улицах ещё пусто, лишь вороны каркают в тиши. К местной поликлинике потихоньку начинает сходиться народ. Двери здания открываются и внутрь заходят первые три человека. Это трое мужчин деревенского вида и коренастого телосложения. Один из них спрашивает на ходу у тетки-регистраторши где сидит врач такой-то. Тётя называет номер кабинета и вся троица прямиком отправляется туда. Спустя минуту входит другой мужчина, сдаёт пальто в раздевалку, надевает бахилы и молча проходит в том же направлении, куда отправились три товарища ранее.

У дверей кабинета начинается словесная перепалка между деревенскими мужчинами за право пройти первым в кабинет. Слово за слово, начинается потасовка. Разгорячённые лица, влетающие в них мощные кулаки, рвутся рубахи и штаны. Дверь кабинета открывается и борьба значительно ускоряется. В ход уже идут удары ниже пояса, укусы и удушающие приёмы. Наконец, один боец прорывается в кабинет врача и дверь за ним захлопывается. Двое других мужчин на минуту успокаиваются, но готовы в любое мгновение возобновить борьбу за право войти в кабинет первым.

Четвертый же мужчина садится у двери в соседний кабинет, достаёт свой телефон и неспешно начинает что-то отмечать в нём. Проходит несколько минут и дверь второго кабинета открывается и медсестра приглашает четвёртого мужчину по имени пройти во второй кабинет.

Деревенские мужики сильно удивились и подскакивают к своей медсестре: «А чего это того мужика позвали по имени, а нам приходится тут драться за право войти в кабинет?». А медсестра им отвечает: «Надо было вам, ребята, записываться на приём заранее, тогда и вас пригласили бы по имени и отчеству!».

Средствами доставки запросов на чтение/запись данных, самих данных для записи и подтверждений об успешности выполнения действий могут быть трубы, очереди сообщений и даже файлы. Суть в том, что в «службохранительном» подходе потокам не нужно драться и тратить свои вычислительные мощности за право получить обслуживание. Это не переизобретение семафора или мьютекса, как тут пишут форумчане выше, это отложенный вид обслуживания по предварительному запросу.

Enthusiast ★★★★
()