Кажется, что нет никакого переносимого способа перечисления потоков в процессе.
В Linux есть pthread_kill_other_threads_np
, который выглядит как остаток от первоначальной реализации pthreads, основанной исключительно на пользователях, которая может работать, а может и не работать, как описано сегодня. Это не говорит вам, сколько потоков было.
Вы можете получить много информации о своем процессе, посмотрев в /proc/self
(или, для других процессов, /proc/123
). Несмотря на то, что многие юниты имеют файл или каталог с таким именем, компоновка полностью отличается, поэтому любой код, использующий /proc
, будет зависеть от Linux. Документация /proc
находится в Documentation/filesystems/proc.txt
в исходном коде ядра. В частности, /proc/self/task
имеет подкаталог для каждого потока. Имя подкаталога - это идентификатор LWP; к сожалению, [1] [2] [3] , похоже, не существует способа связать идентификаторы LWP с идентификаторами pthread (но вы можете получить ваш собственный идентификатор потока с gettid(2)
, если вы работаете на него Конечно, чтение /proc/self/task
не является атомарным; число потоков доступно атомарно через /proc/self/status
(но, конечно, оно может измениться до того, как вы на него воздействуете).
Если вы не можете достичь того, что хотите, с помощью ограниченной поддержки, которую вы получаете от Linux pthreads, другой тактикой является использование трюков с динамическим связыванием, чтобы предоставить собственную версию pthread_create
, которая регистрирует структуру данных, которую вы можете просмотреть позже.