Могу ли я использовать мьютексы pthread в функции деструктора для потоковых данных? - PullRequest
0 голосов
/ 17 ноября 2010

Я выделяю свои специфичные для потока потока данные из глобального пула фиксированного размера, который контролируется мьютексом.(Рассматриваемый код не может динамически выделять память; вся память, которую ему разрешено использовать, предоставляется вызывающей стороной как один буфер. Я не могу сказать, что pthreads может выделять память, но это не означает, что мой кодразрешено.)

Это легко сделать при создании данных, потому что функция может проверить результат pthread_getspecific: если она возвращает NULL, тут же может быть получен мьютекс глобального пула.полученная запись пула и значение, установленное с помощью pthread_setspecific.

Когда поток уничтожается, вызывается функция деструктора (согласно pthread_key_create), но руководство pthreads немного расплывчатоограничения, которые могут быть в силе.

(я не могу наложить какие-либо требования на код потока, такие как необходимость вызова вручную деструктора перед его выходом. Итак, я могу оставить данные выделенными, и, возможно,рассматривать пул как своего рода кеш, повторно используя записи на основе LRU, как только он будет заполнен - ​​и это, вероятно, тот подход, который я бы выбрал для Windowsпри использовании нативного API - но было бы целесообразно правильно освободить данные для каждого потока, когда уничтожен каждый поток.) ​​

Могу ли я просто взять мьютекс в деструкторе?Нет проблем с тем, что уничтожение потока будет немного задержано, если в каком-то другом потоке мьютекс будет взят в этот момент.Но гарантированно ли это работает?Меня беспокоит то, что поток может «больше не существовать» в этот момент.Я использую кавычки, потому что, конечно же, он существует, если он все еще выполняет код!- но будет ли оно достаточно, чтобы позволить получить мьютекс?Это где-нибудь задокументировано?

1 Ответ

1 голос
/ 19 ноября 2010

Объяснение pthread_key_create() , по-видимому, оправдывает выполнение всего, что вы хотите от деструктора, при условии, что вы не позволяете обработчикам сигналов вызывать pthread_exit():

Нет понятиябезопасная для деструкторов функция.Если приложение не вызывает pthread_exit () из обработчика сигнала, или если оно блокирует любой сигнал, чей обработчик может вызвать pthread_exit () при вызове асинхронных небезопасных функций, все функции могут быть безопасно вызваны из деструкторов.

Обратите внимание, однако, что этот раздел является информативным, а не нормативным.

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

...