Ускорение вопросов
Я пытаюсь сделать следующее
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 ответа
Нарушение доступа в этом случае будет означать, что поток работает за пределами срока действия a
объект.
IsTimeOut
должен быть атомарным или защищенным мьютексом, если он написан другим потоком, иначе ваша программа может работать некорректно, но это не должно вызывать нарушение прав доступа.
Вы уничтожаете boost::thread
Возьмите объект немедленно и, таким образом, отсоедините нить, чтобы у вас не было возможности дождаться ее завершения. Я бы предложил хранить объект потока как переменную-член a
и либо присоединиться к ней в деструкторе a
или предоставление явного wait()
функция-член, которая соединяется с потоком.
IsTimeOut
должно быть volatile
если доступ из нескольких потоков, то есть
volatile bool IsTimeOut;
Взгляните на эту статью DDJ.
Если вы покажете больше своего кода, а также объясните, как IsTimeOut
может быть проще сказать, что идет не так. В общем, похоже, у вас есть несколько потоков, и первый создает a
, но что тогда делает этот поток? Будет a
выйти за рамки и тем самым быть уничтоженным? Если это так, то поток таймера наверняка будет иметь нарушение прав доступа, так как объект больше не доступен.