提升线程问题

时间:2011-08-09 08:22:26

标签: c++ multithreading boost

我正在努力做以下事情

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。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

如果从多个线程访问,

IsTimeOut应为volatile,即

volatile bool IsTimeOut;

看看this DDJ article

如果您展示了更多代码,并解释了IsTimeOut如何更改,则可能更容易说出错误。通常,看起来你有多个线程,第一个创建a,但那个线程做了什么呢? a会超出范围而被销毁吗?如果是这样,那么当对象不再可用时,计时器线程肯定会有访问冲突。