2011-12-19 2 views
3

Я поставил много потоков. В более позднее время я хотел бы проверить, остались ли эти потоки живыми (т. Е. Еще не закончены и не прекращены неожиданно).Следите за pthread

  1. Какую информацию следует отслеживать в отношении потоков в первую очередь. Идентификатор потока, идентификатор процесса и т. Д.? Как мне получить эти идентификаторы?

  2. Когда мне нужно проверить жизнеспособность этих потоков, какие функции я должен использовать? Будет ли pthread_kill работать здесь? pthread_kill принимает непрозрачный тип pthread_t как параметр, который, как я считаю, обычно равен unsigned long. Is pthread_t отличается от ID потока? Я предполагаю, что идентификатор потока получит значение int в качестве значения. В некоторых учебниках по pthread они присваивают целому числу pthread как его идентификатор. Должен ли поток получать свой идентификатор из операционной системы?

+0

Отдельный или объединенный? – Duck

+0

@ Duck Я считаю, что я должен учитывать оба фактора. –

+1

pthread_t - это typedef, означающее, что это может быть много, а не просто. Да, pthread_create возвращает threadid как тип данных pthread_t. Используйте массив pthread_t для хранения активных потоков. –

ответ

3
  1. вся личность волоске проживает в pthread_t

  2. Инициализация нить возвращает его pthread_t напечатал идентификатор своего родителя

  3. Каждый поток может получить свой собственный ID с pthread_self()

  4. Вы можете сравнить идентификаторы потоков, используя следующую функцию: int pthread_equal (pthread_t, pthread_t)

Итак: Поддерживать общую структуру данных, где вы можете хранить состояние резьбы, как НАЧАТЬ, RUNNING, ЗАВЕРШЕНА используя pthread_t идентификаторы и pthread_equal функцию сравнения, чтобы различать между нитями. Родитель устанавливает значение STARTED, когда он запускает поток, сам поток устанавливает свое собственное состояние в RUNNING, выполняет свою работу и после этого завершает FINISHED. Используйте мьютекс, чтобы убедиться, что значения не изменяются во время чтения.

EDIT: Вы можете создать своего рода «нить» с помощью деструктора pthread_cleanup_push: http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cleanup_pop.html

т.е. зарегистрировать подпрограмму будет называться, когда поток выходит (либо сам, либо путем отмены извне). Эта процедура может обновлять статус.

+0

Когда поток неожиданно прекращается, каков будет статус этого потока? Другими словами, когда поток больше не существует, как мы должны убедиться, что он ушел? –

+1

AFAIK, вызывающий pthread_kill с SIG, установленным в 0, проверяет, действительно ли поток. Я не уверен, что завершенные потоки, которые когда-то были запущены, считаются действительными. Если это не так, это хорошее условие для использования. – ArjunShankar

+1

@TerryLiYifeng: Возможно, вы сможете использовать обработчики очистки аннулирования pthread, используя 'pthread_cleanup_push' и' pthread_cleanup_pop'. Они вызывается, когда поток отменяется, вызывает 'pthread_exit' или вызывает совпадающий' pthread_cleanup_pop' с ненулевым аргументом. – Hasturkun

2
  1. При вызове pthread_create, первый аргумент является указателем на pthread_t, к которому pthread_create присвоит идентификатор потока вновь созданного потока. Если вы хотите получить идентификатор потока текущего потока, используйте pthread_self(). Это единственная идентифицирующая часть информации, которая вам нужна для потока, потому что все потоки, созданные таким образом, совместно используют один и тот же идентификатор процесса.

  2. Как вы можете проверить, жив ли поток, зависит от того, для чего нужна эта информация. Если вы просто хотите дождаться завершения потока, вы вызываете pthread_join с идентификатором потока в качестве первого аргумента и указателем на местоположение для возвращаемого значения функции потока в качестве второго аргумента. Если вы не отсоедините созданные вами потоки, вызвав в потоке , вам необходимо называть их pthread_join, чтобы они не продолжали удерживаться в их пространстве стека.

    Если по какой-то причине вы хотите что-то сделать во время работы потока, вы можете создать глобальную переменную для каждого потока, которая изменит этот поток при ее завершении, и проверите эту переменную с основным потоком. В этом случае вы, вероятно, захотите отсоединить потоки, чтобы потом вам не пришлось присоединяться к ним.

Смежные вопросы