我目前有一个提升线程
class foo
{
private:
boost::shared_ptr<boost::thread> t;
public:
foo()
{
t = boost::make_shared<boost::thread>(&foo::SomeMethod,this);
}
void SomeMethod()
{
while(true)
{
.... //Does some work
boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); //sleep for 5 seconds
}
}
void stopThread()
{
//Elegant and instant way of stopping thread t
}
}
我已经从this帖子中读到你必须定义中断点但是我不确定我是否理解这将如何适合我的场景。我正在寻找一种安全优雅的方式来确保线程t被终止
答案 0 :(得分:3)
你永远不能安全终止一个线程,你只需要从外面告诉它它应该停止。如果你打断一个线程,你不知道你在哪里打断它,你可能会让系统处于未知状态。
不是永远循环,而是可以在线程循环中检查变量(确保它的线程是安全的!)以查看线程是否应该退出。我在工作线程中做的是让他们等待条件变量,然后当他们工作时他们醒来并且工作,但是当他们醒来时他们也检查“关闭”标志以查看他们是否应该退出。 / p>
我的代码片段:
//-----------------------------------------------------------------------------
void Manager::ThreadMain() {
unique_lock<mutex> lock( m_work_mutex, std::defer_lock );
while( true ) {
lock.lock();
while( m_work_queue.empty() && !m_shutdown ) {
m_work_signal.wait( lock );
}
if( !m_work_queue.empty() ) {
// (process work...)
continue;
}
// quit if no work left and shutdown flag set.
if( m_shutdown ) return;
}
}
你可能会得到类似的东西:
std::atomic<bool> stop_thread = false;
void SomeMethod()
{
while( !stop_thread )
{
.... //Does some work
boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); //sleep for 5 seconds
}
}
void stopThread()
{
stop_thread = true;
// join thread (wait for it to stop.)
t->join();
}
让我告诉你,有时候安全退出并不容易。几个星期前,我在线程控制台输入方面遇到了很大的困难。我最终必须自己处理原始的Windows控制台事件并将它们转换为击键,这样我就可以同时拦截我的自定义关闭事件。
答案 1 :(得分:0)
使用boost :: thread中断()
#include <iostream>
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
class Foo
{
private:
boost::shared_ptr<boost::thread> t;
public:
Foo()
{
t = boost::make_shared<boost::thread>(&Foo::SomeMethod, this);
}
void SomeMethod()
{
std::cout << "thread starts" << std::endl;
while(true) {
std::cout << "." << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
}
void stopThread()
{
t->interrupt();
t->join();
std::cout << "thread stopped" << std::endl;
}
};
int main()
{
Foo foo;
boost::this_thread::sleep(boost::posix_time::seconds(5));
foo.stopThread();
return 0;
}
执行
# g++ f.cpp -lboost_thread && ./a.out
thread starts
.
.
.
.
.
thread stopped