中断提升线程

时间:2012-03-14 16:15:11

标签: c++ multithreading boost boost-thread

我希望能够按如下方式中断线程。

void mainThread(char* cmd)
{   
    if (!strcmp(cmd, "start"))
        boost::thread thrd(sender); //start thread

    if (!strcmp(cmd, "stop"))
        thrd.interrupt();       // doesn't work, because thrd is undefined here

}

thrd.interrupt()是不可能的,因为当我尝试中断它时, thrd 对象是未定义的。我怎样才能解决这个问题?

3 个答案:

答案 0 :(得分:5)

使用move assignment operator

void mainThread(char* cmd)
{   
    boost::thread thrd;

    if (!strcmp(cmd, "start"))
        thrd = boost::thread(sender); //start thread

    if (!strcmp(cmd, "stop"))
        thrd.interrupt();

}

答案 1 :(得分:1)

Boost线程是可移动的,因此您可以执行以下操作:

boost::thread myThread;
if ( isStart ) {
    myThread = boost::thread(sender);
else if ( isStop ) {
    myThread.interrupt();
}

如果你想传递它(例如作为函数的参数), 你可能想要使用指针或引用:

void
mainThread( std::string const& command, boost::thread& aThread )
{
    if ( command == "start" ) {
        aThread = boost::thread( sender );
    } else if ( command == "stop" ) {
        aThread.interrupt();
    }
}

(这可能需要更多。例如,如果你执行的话,写完了 mainThread( "start" )连续两次,你将分离第一个帖子, 并且永远无法再次参考它。)

另一种选择是使用boost :: shared_ptr。

答案 2 :(得分:0)

这不是关于boost :: thread的问题,而是关于范围:

这样:

if(Condition)
    MyType foo;
... // foo is out of scope
foo.method(); // won't work, no foo in scope

与此相同:

if(Condition) 
{
    MyType foo;
} // after this brace, foo no longer exists, so...
foo.method(); // won't work, no foo in scope

请注意,上面的答案都是这样的:

MyType foo:
if (Condition)
    foo.method(); // works because now there is a foo in scope
else
{
    foo.otherMethod(); // foo in scope here, too.
}