Ускорение вопросов

Я пытаюсь сделать следующее

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 выйти за рамки и тем самым быть уничтоженным? Если это так, то поток таймера наверняка будет иметь нарушение прав доступа, так как объект больше не доступен.

Другие вопросы по тегам