当主应用程序处于while循环时,提升线程未运行

时间:2013-01-09 13:16:41

标签: c++ multithreading boost sleep

我是使用boost线程的新手。我几乎跑了一些东西,但遇到了绊脚石:任何帮助都会受到赞赏。

我有一个VC ++(VS2010 Windows窗体)应用程序。在不久的将来,这需要移植到C ++和Linux,因此我使用boost库来处理线程以“轻松”移植端口。

我在一个执行一些i / o的类中有一个worker函数:

void myClass::doIO{

    while (!boolKillthread){


    //do some work

    //sleep thread 
    boost::this_thread::sleep_for(boost::chrono::milliseconds(333));
    }
}

在一个提升线程中被启动:

boost::thread m_MyThread;
m_MyThread = boost::thread(boost::bind(&myClass::doIO));

这工作正常,i / o端口正在被轮询,并且正在完全回调到父类。但是:

我有一个其他函数需要在doIO线程上等待执行一些工作,所以我有一个代码的函数:

while (myClass.IsWorkDone() == true){

    //hang a around a while

    //lines commented out below have been tried, but don't resolve the problem
    //boost::this_thread::yield();
    //boost::this_thread::sleep(boost::posix_time::milliseconds(50));
    //boost::this_thread::sleep_for(boost::chrono::milliseconds(50));

}

问题是,只要我的代码进入while循环,boost线程doIO就会停止 - 几乎就好像它没有在它自己的线程中运行一样!我试过插入睡眠和放大器根据上面注释掉的线路收益,但无济于事。

有什么想法吗?


感谢所有的回复:是的,(伪代码)“IsWorkDone”只是返回一个变量,所以我理解(现在已经尝试过)使用boost :: mutex :: scoped_lock来更新该变量,所以我们有

之类的东西
bool myWorkIsDone = false;

bool myClass::IsWorkDone{ return myWorkIsDone; }



void myClass::doIO{

    while (!boolKillthread){


    //do some work
    if (SomeCondition){
        boost::mutex::scoped_lock lock(myMutex);
        myWorkIsDone = true;
    }

    //sleep thread 
    boost::this_thread::sleep_for(boost::chrono::milliseconds(333));
    }
}

这很好,但关键在于(除非我遗漏了一些显而易见的东西,这完全可能)当我的主代码在循环中时,线程似乎没有运行

while(myClass.IsWorkDone()== true){

    //hang a around a while

}

因为IDE将在doIO中的断点处正常停止,但是当执行在上面的while循环中时不是。

实际上还没有更多的代码(相关性)可以添加 - 它应该非常简单,但它不起作用!

1 个答案:

答案 0 :(得分:2)

IsWorkDone看起来像什么?它看起来像这样:

 bool IsWorkDone() const { return workdone_; }

因为如果确实如此,那就是你的问题。您需要使用互斥锁来包含对workdone_的访问权限。这是共享状态,共享状态需要互斥锁。编译器可能正在读取循环顶部的变量,并且从不打扰再次读取它。毕竟,据它所知,没有任何理由可以改变它,所以重新阅读它是没有意义的。

即使它再次读取它,CPU也有一个很好的缓存行,它可能永远不会被刷新,所以你只是在阅读它。

哦,当你设置它时,它也需要一个互斥锁。

将其设为::std::atomic<bool>实际上是一个更好的主意,但我猜你还没有。