当主应用程序处于while循环时,Boost线程未运行
boost thread not running whilst main application is in a while loop
我对使用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>
实际上是一个更好的主意,但我猜你还没有。
- BOOST线程:线程还是进程
- 如何解决传递给boost线程的函数中的歧义
- cpp 为什么 boost::线程内部的循环不遍历所有值并且推送相同的值?
- C 从类的构造函数运行Boost线程
- 重新分配独立的boost ::线程安全吗?
- Boost::线程如何在主线程和工作线程之间同步
- 链接Boost线程库
- BOOST ::线程内会成员功能调用返回unique_lock Instantiation错误
- Boost ::线程何时终止?如何管理Boost ::线程
- 链接到boost ::线程失败
- 在C 中处理Boost线程条件
- Poco任务管理器/Boost线程混合和匹配
- 创建一个 boost::线程 带有 boost::bind() 或不带
- 为不受支持的平台调整Boost线程/进程
- 删除boost ::线程后代
- 我需要在Boost线程功能中调用Unlock()
- C OPENCV图像在Boost线程中不显示
- boost ::线程在删除可加入线程时存在什么问题
- 增强异步插座和Boost ::线程
- 如何使boost ::线程入睡