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

boost thread not running whilst main application is in a while loop

本文关键字:Boost 线程 运行 循环 应用程序 while      更新时间:2023-10-16

我对使用boost线程相当陌生。我差不多有东西运行了,但是遇到了一个绊脚石,希望你能帮助我。

我有一个vc++ (VS2010 Windows窗体)应用程序。在不久的将来,这需要移植到c++和Linux,所以我正在使用boost库来"缓解"移植。

我在一个类中有一个工作函数执行一些I/o:

void myClass::doIO{
    while (!boolKillthread){

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

在boost线程中启动:

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循环中执行时不会。

真的没有任何更多的代码(相关)添加-它应该是相当简单的,但它没有工作!

IsWorkDone长什么样子?它看起来像这样吗?

 bool IsWorkDone() const { return workdone_; }

因为如果是这样,那就是你的问题了。您需要使用互斥锁来封装对workdone_的访问。这是共享状态,共享状态需要互斥。编译器可能会在循环的顶部读取变量,而不会再次读取它。毕竟,就它所能判断的而言,根本没有理由改变它,所以没有必要再读一遍。

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

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

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