| | | | Browse by category |
How do I kill all the running threads in RWThreadPool?
Action
You can not kill the running threads in an RWThreadPool. It is not considered a good practice to kill running threads, as they may be holding system resources like file handles, database connections, or network resources, or the threads may have acquired synchronization object like a mutex. To get around these problems, you can design your application to make your threads exit safely under abnormal conditions.
You can write a cancellation mechanism that will stop the threads that enter blocking state or infinite loops. For the RWThreadPool, you need to write your own cancellation mechanism (which is fairly simple) because the threads just execute the Functor passed in.
<pre>
RWBoolean Die = FALSE; // Tell running threads to stop...
RWBoolean CanThreadRun(void) {
return Die;
}
void StopThreads(void) { // threads are told to stop
Die = TRUE;
}
void AllowThreads(void) { // and are allowed to go
Die = FALSE;
}
void WorkFunction(RWFunctor0<RWBoolean> func) {
while(!func())
{
; // loop
}
}
int main(void)
{
RWThreadPool pool = RWThreadPool::make();
pool.start();
AllowThreads(); // allow threads to run
RWTFunctorR0G<RWBoolean> check= RWTFunctorR0GImp<RWBoolean>::make (CanThreadRun);
// enqueue some work
RWFunctor0 work = RWFunctor0GA1Imp<void, RWTFunctorR0G<RWBoolean> >::make(WorkFunction, check);
pool.enqueue(work);
// need to stop thread running work...
StopThreads(); // tell threads to stop
// more work or whatever...
AllowThreads(); // allow threads to run
// enqueue the work
StopThreads(); // tell threads to stop
return 0;
}
</pre>
If you need finer granularity, an RWBoolean for each thread will be sufficient. You don't need to use a functor, but it makes it much easier to abstract away the details of stopping a particular thread. Another thing you could do would be to use IOUs or a simple Boolean flag that tells a particular Thread (or Thread group) to quit. Refer to knowledge base article: How do I stop a thread that is blocked on a system call or performing I/O? on how to use the IOUs to terminate threads using a cancellation mechanism.