我是使用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循环中时不是。
实际上还没有更多的代码(相关性)可以添加 - 它应该非常简单,但它不起作用!
答案 0 :(得分:2)
IsWorkDone
看起来像什么?它看起来像这样:
bool IsWorkDone() const { return workdone_; }
因为如果确实如此,那就是你的问题。您需要使用互斥锁来包含对workdone_
的访问权限。这是共享状态,共享状态需要互斥锁。编译器可能正在读取循环顶部的变量,并且从不打扰再次读取它。毕竟,据它所知,没有任何理由可以改变它,所以重新阅读它是没有意义的。
即使它再次读取它,CPU也有一个很好的缓存行,它可能永远不会被刷新,所以你只是在阅读它。
哦,当你设置它时,它也需要一个互斥锁。
将其设为::std::atomic<bool>
实际上是一个更好的主意,但我猜你还没有。