Mi implementación de subprocesos utiliza el idioma pimpl, y en la clase Impl tengo una versión para cada sistema operativo que soporte y también una que usa boost, por lo que puedo decidir cuál usar al construir el proyecto.
Decidí hacer dos clases: una es Thread, que solo tiene los servicios básicos, provistos por OS; y el otro es SafeThread, que hereda de Thread y tiene un método para la interrupción colaborativa.
El subproceso tiene un método de terminación() que produce una terminación intrusiva. Es un método virtual que está sobrecargado en SafeThread, donde señala un objeto de evento. Hay un método (estático) yeld() que el hilo en ejecución debe llamar de vez en cuando; este método verifica si el objeto del evento está señalizado y, si es así, arroja una excepción atrapada en la persona que llama del punto de entrada del hilo, terminando así el hilo. Cuando lo hace, señala un segundo objeto de evento para que la persona que llama de terminate() sepa que el hilo se detuvo de manera segura.
Para los casos en los que existe riesgo de interbloqueo, SafeThread :: terminate() puede aceptar un parámetro de tiempo de espera excedido. Si el tiempo de espera expira, llama a Thread :: terminate(), matando intrusivamente el hilo. Este es un último recurso cuando tienes algo que no puedes controlar (como una API de un tercero) o en situaciones en las que un interbloqueo hace más daño que las fugas de recursos y cosas por el estilo.
Espero que esto sea útil para su decisión y le dará una imagen lo suficientemente clara sobre mis opciones de diseño. Si no, puedo publicar fragmentos de código para aclarar si lo desea.
Merece la pena señalar que si puede matar un hilo, eso puede dejar recursos asignados en la memoria (ya que el hilo se eliminó antes de que se eliminaran). Entonces, creo que esto es, al menos en la mayoría de los casos, una buena decisión. – luiscubal
Hay cosas incluso peores que las filtraciones, como transacciones incompletas, un montón corrupto o bloqueos aún retenidos. – peterchen
si le importa la corrección, realmente no tiene otra opción: entonces los hilos solo * se pueden interrumpir de forma cooperativa, cuando están en estados "intercalados" predefinidos. – jalf