Как проверить, работает ли какая-нить в данный момент - PullRequest
0 голосов
/ 19 июня 2010

Я знаю, что есть один для нескольких процессов

 waitpid(-1,WNOHANG,NULL)

, который является неблокирующим вызовом функции, чтобы проверить, есть ли какой-либо дочерний процесс, работающий в настоящее время на

Но есть ли подобная библиотекаФункция для проверки многопоточности?

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

Ответы [ 4 ]

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

Я задал себе что-то очень похожее:

Вызов API POSIX для получения списка всех потоков pthread, запущенных в процессе

В вашем случае я бы просто завернул ps -eLF.

0 голосов
/ 20 июня 2010

pthread_kill (pid, 0) где pid - это идентификатор потока, который вернул pthread_create, может сказать вам, если поток еще жив.(Вот как я понимаю ваш вопрос) Возвращает 0, если поток все еще жив, и код ошибки в противном случае.

0 голосов
/ 20 июня 2010

, который является неблокирующим вызовом функции, чтобы проверить, есть ли какой-либо дочерний процесс, в настоящее время работающий на

Неправильно. Это вызов, чтобы проверить, есть ли дочерний процесс, который еще не завершен. И это не только проверяет, но и пожинает прерванного ребенка, если таковой имеется. В противном случае дети могут оказаться в любом возможном состоянии, например, в тупике (что в моей книге далеко не работает ).

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

Возможно, вам следует опубликовать здесь вопрос, почему вы хотите это сделать. Похоже, вы делаете что-то ужасно неправильно.

Если вы еще не сделали pthread_join () для своих потоков, это означает, что ваши потоки уже выполняют pthread_detach (). Если у вас не было проблем с добавлением в ваши потоки pthread_detach (), я думаю, не было бы проблем с добавлением некоторого дополнительного кода в потоки, чтобы определить, что они (почти) завершены (например, sem_post ()), так что main () может заметить, что поток завершился (например, вызвав sem_trylock ()).

Если переносимость не является обязательной, то можно также периодически пытаться запрашивать номер потока процесса в ОС.

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

0 голосов
/ 20 июня 2010

Вы можете просто сохранить дескриптор потока и иметь функцию, чтобы проверить, работает ли он по-прежнему.Я не уверен, есть ли функция, но это должно работать.

...