我正在努力做以下事情
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。
但是,我总是在调试中遇到访问冲突。
答案 0 :(得分:2)
在这种情况下,访问冲突将表明该线程正在a
对象的生命周期之外运行。
IsTimeOut
需要是原子的,或者如果是由另一个线程写的,则需要互斥锁保护,否则你的程序可能无法正常工作,但这不应该导致访问冲突。
您正在立即销毁boost::thread
对象,从而分离线程,因此您无法等待它完成。我建议将线程对象存储为a
的成员变量,并在a
的析构函数中与它连接,或者提供与线程连接的显式wait()
成员函数。 / p>
答案 1 :(得分:0)
IsTimeOut
应为volatile
,即
volatile bool IsTimeOut;
如果您展示了更多代码,并解释了IsTimeOut
如何更改,则可能更容易说出错误。通常,看起来你有多个线程,第一个创建a
,但那个线程做了什么呢? a
会超出范围而被销毁吗?如果是这样,那么当对象不再可用时,计时器线程肯定会有访问冲突。