Проверьте состояние потока, оставляя его в состоянии ожидания - PullRequest
3 голосов
/ 30 июля 2011

Мне интересно, возможно ли проверить состояние потока, который может находиться в состоянии ожидания, но не обязательно, и если он находится в состоянии ожидания, я хотел бы оставить его в этом состоянии,

По сути, как я могу проверить состояние потока, не меняя его (ожидаемое) состояние.

Под ожиданием я имею в виду, что если бы я вызвал wait (pid), он бы возвращался правильно и не зависал.

Позвольте мне также добавить, что я отслеживаю многопоточную программу, поэтому я не могу изменить ее код.Также я пропустил эту информацию, но это система на основе Linux.

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

Вы спрашиваете о процессах или потоках?Функция wait действует на процессы, а не на потоки, поэтому заданный вопрос недопустим.

Для (дочерних) процессов вы можете проверить состояние, вызвав waitid с флагом WNOWAIT,Это оставит процесс в состоянии ожидания.

Для потоков в некоторых реализациях вы можете вызвать pthread_kill(thread, 0) и проверить на ESRCH, чтобы определить, завершился ли поток или нет, оставив thread вприсоединяемое государство.Обратите внимание, что это действительно , только если поток является присоединяемым .Если он был отсоединен или уже присоединен, вы вызываете Undefined Behavior, и ваша программа должна аварийно завершить работу или еще хуже.К сожалению, в этом случае не требуется, чтобы pthread_kill сообщал ESRCH, поэтому он может ложно сообщить, что поток все еще существует, хотя фактически он уже завершен.Конечно, формально нет никакой разницы между потоком, который вечно сидит между вызовом pthread_exit и фактическим завершением, и потоком, который фактически завершил завершение, поэтому вопрос немного бессмысленный.Другими словами, не требуется, чтобы присоединяемый поток завершался до тех пор, пока pthread_join не будет заблокирован в ожидании завершения.

0 голосов
/ 30 июля 2011

Вы хотите сделать что-то подобное (псевдокод)?

if (status(my_thread) == waiting)
    do_something();
else
    do_something_else();

Если это действительно то, что вы пытаетесь сделать, вы подвергаете себя гоночным условиям. Например, что если my_thread проснется после status(my_thread), но до do_something() (или даже до == waiting)?

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

Кстати, Ливерморская национальная лаборатория им. Лоуренса имеет отличное учебное пособие по многопоточным концепциям на https://computing.llnl.gov/tutorials/pthreads/ (включая условные переменные). Этот конкретный документ использует POSIX API, но объясненные концепции универсальны.

...