Вызов API POSIX для вывода списка всех потоков, запущенных в процессе - PullRequest
18 голосов
/ 13 августа 2010

У меня есть многопоточное приложение в среде POSIX / Linux - я не контролирую код, который создает pthreads. В какой-то момент процесс - владелец pthreads - получает сигнал.

Обработчик этого сигнала должен прервать, отменить или остановить все pthreads и записать, сколько pthreads было запущено.

Моя проблема в том, что я не смог найти, как составить список всех запущенных pthreads.

Ответы [ 3 ]

22 голосов
/ 13 августа 2010

Кажется, что нет никакого переносимого способа перечисления потоков в процессе.

В 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, которая регистрирует структуру данных, которую вы можете просмотреть позже.

0 голосов
/ 13 августа 2010

Учитывая, что потоки находятся в вашем процессе, они должны быть под вашим контролем.Вы можете записать их все в структуру данных и отслеживать.

Однако выполнение этого не будет свободным от состояния гонки, если оно не управляется надлежащим образом (или вы когда-либо только создаете и присоединяете потоки из одного потока).

Любые потоки, созданные библиотеками, которые вы используете, являются их бизнесом, и вам не следует связываться с ними в каталоге, иначе библиотека может сломаться.

Если вы, конечно, планируете выйти из процесса, выв любом случае можно просто оставить потоки работающими, так как вызов exit () завершает их все.

Помните, что надежное приложение в любом случае должно быть защищено от сбоев, поэтому вы не должны зависеть от поведения завершения работы, чтобы избежать потери данных и т. д.

0 голосов
/ 13 августа 2010

Вы можете обернуть ps -eLF (или другую команду, которая более внимательно читает только интересующий вас процесс) и прочитать столбец NLWP, чтобы узнать, сколько потоков запущено.

...