Что делает pthread несуществующим?
-
02-07-2019 - |
Вопрос
я работаю с многопоточной программой (используя pthreads), которая в настоящее время создает фоновый поток (PTHREAD_DETACHED), а затем вызывает pthread_exit(0).Моя проблема заключается в том, что процесс затем отображается как «несуществующий» и, как ни странно, не «реально существует» в /proc (что противоречит моим стратегиям отладки).
Я хотел бы, чтобы были соблюдены следующие требования:
- программа должна запускать функцию A в цикле и функцию B один раз
- учитывая PID программы, /proc/$pid/exe, /proc/$pid/maps и /proc/$pid/fd должны быть доступны (когда процесс не существует, все они являются пустыми или недействительными ссылками)
- должна быть возможность приостановить/прервать программу с помощью CTRL+C и CTRL+Z, как обычно
редактировать: Я не решаюсь изменить интерфейс программы, чтобы A находился в «основном» потоке, а B — в порожденном потоке (сейчас они работают по-другому).Решит ли это проблему?
Решение
Вы можете либо приостановить выполнение основного процесса в ожидании сигнала, либо не отключать поток (используя значение по умолчанию). PHTREAD_CRATE_JOINABLE) ожидание его завершения с помощью pthread_join()
.
Другие советы
Есть ли причина, по которой вы не можете сделать все наоборот:заставить основной поток запустить цикл и выполнить одноразовую задачу в фоновом потоке?
Не самый элегантный дизайн, но, возможно, вы могли бы заблокировать основной поток перед выходом с помощью:
while(1) {
pause();
}
Затем вы можете установить обработчик сигналов для SIGINT и SIGTERM, который разрывает цикл.Самый простой способ для этого:выход(0) :-).