Я выделяю свои специфичные для потока потока данные из глобального пула фиксированного размера, который контролируется мьютексом.(Рассматриваемый код не может динамически выделять память; вся память, которую ему разрешено использовать, предоставляется вызывающей стороной как один буфер. Я не могу сказать, что pthreads может выделять память, но это не означает, что мой кодразрешено.)
Это легко сделать при создании данных, потому что функция может проверить результат pthread_getspecific
: если она возвращает NULL
, тут же может быть получен мьютекс глобального пула.полученная запись пула и значение, установленное с помощью pthread_setspecific
.
Когда поток уничтожается, вызывается функция деструктора (согласно pthread_key_create
), но руководство pthreads немного расплывчатоограничения, которые могут быть в силе.
(я не могу наложить какие-либо требования на код потока, такие как необходимость вызова вручную деструктора перед его выходом. Итак, я могу оставить данные выделенными, и, возможно,рассматривать пул как своего рода кеш, повторно используя записи на основе LRU, как только он будет заполнен - и это, вероятно, тот подход, который я бы выбрал для Windowsпри использовании нативного API - но было бы целесообразно правильно освободить данные для каждого потока, когда уничтожен каждый поток.)
Могу ли я просто взять мьютекс в деструкторе?Нет проблем с тем, что уничтожение потока будет немного задержано, если в каком-то другом потоке мьютекс будет взят в этот момент.Но гарантированно ли это работает?Меня беспокоит то, что поток может «больше не существовать» в этот момент.Я использую кавычки, потому что, конечно же, он существует, если он все еще выполняет код!- но будет ли оно достаточно, чтобы позволить получить мьютекс?Это где-нибудь задокументировано?