Следите за pthread - PullRequest
       10

Следите за pthread

3 голосов
/ 19 декабря 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011
  1. Весь идентификатор потока находится в pthread_t

  2. Инициализация потока возвращает его pthread_t введенный идентификатор его родителю

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

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

Итак: Поддерживайте общую структуру данных, в которой вы можете сохранять статус потока как STARTED, RUNNING, FINISHED, используя pthread_t ID и pthread_equal функцию сравнения для различения потоков.Родитель устанавливает значение STARTED при запуске потока, сам поток устанавливает свое собственное состояние на RUNNING, выполняет свою работу и устанавливает себя в FINISHED после завершения.Используйте мьютекс, чтобы убедиться, что значения не изменяются во время чтения.

РЕДАКТИРОВАТЬ: Вы можете настроить своего рода «деструктор потока», используя pthread_cleanup_push: http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cleanup_pop.html

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

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

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

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

...