Как определить, активен ли поток - PullRequest
0 голосов
/ 23 декабря 2011

Используя MS VC ++ и поток Boost, у меня есть подпрограмма - фактически процедура Windows - в главном потоке, которая вызывается много раз. При каждом вызове подпрограмма создает новый поток - я планирую создать объект потока в постоянном пространстве с помощью new и прикрепить результат к глобальному -static-pointer-. Требуется прекратить предыдущее условие, если при следующем вызове процедуры предыдущий поток все еще работает.

Я прочитал: «Так же как время жизни файла может отличаться от времени жизни объекта iostream, который представляет файл, время жизни потока выполнения может отличаться от объекта потока, который представляет поток В частности, после вызова join () поток выполнения больше не будет существовать, даже если объект потока продолжает существовать до конца своего обычного времени жизни. Возможно и обратное, если объект потока уничтожается без Функция join (), вызванная в первый раз, продолжает выполнение потока до тех пор, пока его начальная функция не завершится ".

Перед тем, как заново изобрести колесо, возникает вопрос: существует ли стандартный метод определения, работает ли нить? В таком случае: каков канонический метод его прекращения?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Канонический способ завершения потока - через join или interrupt, в зависимости от того, что именно делает ваш поток. Насколько я знаю, нет единственной функции, которая возвращает, работает ли поток все еще или нет, однако вы можете попробовать вызвать timed_join с временем ожидания 0:

Возвращает:

true, если * это относится к потоку выполнения при входе, и этот поток выполнения завершен до истечения времени ожидания вызова, false в противном случае.

0 голосов
/ 23 декабря 2011

Как насчет использования метода <a href="http://www.boost.org/doc/libs/1_48_0/doc/html/thread/thread_management.html#thread.thread_management.thread.joinable" rel="nofollow">joinable</a>?

Возвращает true, если * это относится к потоку выполнения, в противном случае - false.

Существует два способазавершить поток: join, что несколько чище, или вы можете позвонить detach.

...