c++ - seguidores - hashtags instagram
¿Cómo puedo decir de manera confiable si un subproceso de impulso ha salido de su método de ejecución? (7)
Asumí que joinable lo indicaría, sin embargo, no parece ser el caso.
En una clase de trabajadores, intentaba indicar que aún estaba procesando a través de un predicado:
bool isRunning(){return thread_->joinable();}
¿No se podría unir un hilo que haya salido? ¿Qué me estoy perdiendo ... cuál es el significado de boost thread :: joinable?
Dado que puede unirse a un hilo incluso después de que haya finalizado, joinable () seguirá siendo verdadero hasta que llame a join () o detach (). Si desea saber si un hilo aún se está ejecutando, debe poder llamar a timed_join con un tiempo de espera de 0. Tenga en cuenta que esto puede dar como resultado una condición de carrera ya que el hilo puede finalizar inmediatamente después de la llamada.
Esto es un poco crudo, pero a partir de ahora todavía está trabajando para mis requisitos. :) Estoy usando boost 153 y qt. Creé un vector de int para rastrear el "estado" de mis hilos. Cada vez que creo un nuevo hilo, agrego una entrada a thread_ids con un valor de 0. Para cada hilo creado, paso una identificación así sé qué parte de thread_ids se supone que debo actualizar. Establezca el estado en 1 para ejecutar y otros valores, dependiendo de la actividad que esté realizando actualmente, así sabré qué actividad se estaba realizando cuando finalizó el hilo. 100 es el valor que configuro para un hilo terminado correctamente. No estoy seguro si esto ayudará, pero si tiene otras sugerencias sobre cómo mejorar esto, hágamelo saber. :)
std::vector<int> thread_ids;
const int max_threads = 4;
void Thread01(int n, int n2)
{
thread_ids.at(n) = 1;
boost::this_thread::sleep(boost::posix_time::milliseconds(n2 * 1000));
thread_ids.at(n) = 100;
qDebug()<<"Done "<<n;
}
void getThreadsStatus()
{
qDebug()<<"status:";
for(int i = 0; i < max_threads, i < thread_ids.size(); i++)
{
qDebug()<<thread_ids.at(i);
}
}
int main(int argc, char *argv[])
{
for(int i = 0; i < max_threads; i++)
{
thread_ids.push_back(0);
threadpool.create_thread(
boost::bind(&boost::asio::io_service::run, &ioService));
ioService.post(boost::bind(Thread01, i, i + 2));
getThreadsStatus();
}
ioService.stop();
threadpool.join_all();
getThreadsStatus();
}
Estoy usando boost 1.54, por lo cual la etapa timed_join () está en desuso. Dependiendo de su uso, puede usar joinable () que funciona perfectamente para mis propósitos, o alternativamente puede usar try_join_for () o try_join_until (), consulte:
http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html
La forma más fácil, si la función que está ejecutando su hilo es lo suficientemente simple, es establecer una variable en verdadero cuando la función haya finalizado. Por supuesto, necesitará una variable por hilo, si tiene muchos mapas de identificadores de subprocesos y el estado puede ser una mejor opción. Sé que está hecho a mano, pero funciona bien mientras tanto.
class ThreadCreator
{
private:
bool m_threadFinished;
void launchProducerThread(){
// do stuff here
m_threadRunning = true;
}
public:
ThreadCreator() : m_threadFinished(false) {
boost::thread(&Consumer::launchProducerThread, this);
}
};
Puede que esta no sea una respuesta directa a su pregunta, pero veo el concepto de hilo como un mecanismo realmente liviano e intencionalmente desprovisto de todo, excepto de los mecanismos de sincronización. Creo que el lugar correcto para poner "se está ejecutando" está en la clase que define la función de subprocesos. Tenga en cuenta que desde una perspectiva de diseño, puede salir del hilo en la interrupción y aún así no completar su trabajo. Si desea limpiar el hilo después de que se haya completado, puede envolverlo en un puntero seguro y entregarlo a la clase de trabajadores.
Usted fundamentalmente no puede hacer esto. La razón es que las dos respuestas posibles son "Sí" y "No cuando la vi por última vez, pero quizás ahora". No hay una manera confiable de determinar si un hilo todavía está dentro de su método de ejecución, incluso si hubiera una manera confiable de determinar lo contrario.
Utilice thread::timed_join() con un tiempo de espera mínimo. Devolverá falso si el hilo todavía se está ejecutando.