I want to terminate or kill boost thread. code is here:
DWORD WINAPI StartFaceDetector(LPVOID temp)
{
int j=0;
char **argv1;
QApplication a(j,argv1);//add some thread here
gui::VisualControl w;
t=&w;
boost::thread u(&faceThread);
w.show();
a.exec();
// I Want to close u thread here.
return 0;
}
I want to close that boost thread before return of function. Thanks in Advance.
A running thread can be interrupted by calling the interrupt () member function on the corresponding boost::thread object. If the thread doesn't have a boost::thread object (e.g the initial thread of the application), then it cannot be interrupted.
3 kill boost thread after n seconds 46 Using boost thread and a non-static class function 2 Have main thread wait for a boost thread complete a task (but not finish) 592 How to install Boost on Ubuntu
The boost::thread class is responsible for launching and managing threads. Each boost::thread object represents a single thread of execution, or Not-a-Thread, and at most one boost::thread object represents a given thread of execution: objects of type boost::thread are not copyable.
This action can be done by using the interrupt () method. Whenever Thread.interrupt () is called, it sets a flag known as the interrupt status to true. This means that the thread has to stop performing further execution. The default value of this flag is false.
On Windows:
TerminateThread(u.native_handle(), 0);
On Linux / QNX / UNIX / any platform with pthread support:
pthread_cancel(u.native_handle());
or
pthread_kill(u.native_handle(), 9);
Note that boost authors intentionally left this out as the behaviour is platform-dependent and not well defined. However, you're not the only one to ever reach for this functionality...
Use interrupt()
. Also, you should define interruption points. Thread will be interrupted after calling interrupt()
as soon as it reaches one of interruption points.
u.interrupt();
More info:
Calling
interrupt()
just sets a flag in the thread management structure for that thread and returns: it doesn't wait for the thread to actually be interrupted. This is important, because a thread can only be interrupted at one of the predefined interruption points, and it might be that a thread never executes an interruption point, so never sees the request. Currently, the interruption points are:
boost::thread::join()
boost::thread::timed_join()
boost::condition_variable::wait()
boost::condition_variable::timed_wait()
boost::condition_variable_any::wait()
boost::condition_variable_any::timed_wait()
boost::this_thread::sleep()
boost::this_thread::interruption_point()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With