Boost线程问题

Boost thread questions

本文关键字:问题 线程 Boost      更新时间:2023-10-16

我正在尝试做以下事情

class a{
public:
  void Start();
  void Tick();
  bool IsTimeOut;
};
void a::Start()
{
  boost::thread thread1(boost::bind(&a::Tick,this));
}
void a::Tick()
{
  while(!IsTimeOut)
  {
    boost::this_thread::sleep(boost::posix_time::millisec(1000));
  }
}

我的环境是vs2005和win7。

但是,我在调试中总是遇到访问冲突

在这种情况下,访问冲突将表明线程正在运行超过a对象的生命周期。

IsTimeOut需要是原子的,或者如果它是由另一个线程写的,则需要由互斥锁保护,否则程序可能无法正常工作,但这不应该导致访问冲突。

您正在立即销毁boost::thread对象,从而分离线程,因此您没有办法等待它完成。我建议将线程对象存储为a的成员变量,或者在a的析构函数中与它连接,或者提供一个显式的wait()成员函数与线程连接。

如果从多个线程访问,

IsTimeOut应该是volatile,即

volatile bool IsTimeOut;

看看这篇DDJ的文章。

如果您展示更多的代码,并解释IsTimeOut是如何更改的,则可能更容易说明哪里出了问题。一般来说,看起来您有多个线程,第一个线程创建a,但是该线程然后做什么?a是否会脱离范围而被摧毁?如果是这样,那么计时器线程肯定会有访问冲突,因为对象不再可用。