std::thread. R6010 - abort() has been called
От: s3dworld Россия  
Дата: 26.01.13 11:17
Оценка: -1 :))
Всем доброго дня!

Использую поток от STL (std::thread) из нового стандарта (работаю с Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov2012)). Есть класс TCPServer, содержащий в себе этот поток:

class TCPServer final : public WaitingPoint
{
  public:
    boost::asio::io_service* ioService;

  private:
    std::atomic_bool isExit;
    std::thread thread;
    boost::asio::ip::tcp::acceptor* ioAcceptor;
    std::atomic_bool isWaitingAccept;
    std::shared_ptr<ConnectionPoint> connectionAccept;

    ...
};


Затем в один из моментов я запускаю поток (то есть до этого функцию обработки я ему не указывал):

Result TCPServer::init(void)
{
  isExit=false;
  ioService=new (std::nothrow) boost::asio::io_service();
  if(!ioService) return Result::errorMemory;
  ioAcceptor=new (std::nothrow) boost::asio::ip::tcp::acceptor(*ioService);
  if(!ioAcceptor) return Result::errorMemory;
  tcp.set(ioAcceptor,nullptr);
  thread=std::thread(std::bind(&TCPServer::loop,std::static_pointer_cast<TCPServer>(shared_from_this())));
  return Result::ok;
}


Он крутит цикл:

Result TCPServer::loop(void)
{
  boost::system::error_code ec;
  while(!isExit)
  {
    ioService->run_one(ec);
    ioService->reset();
  }
  return Result::ok;
}


И когда мне уже он не нужен, я вызываю это:

void TCPServer::free(void)
{
  ioAcceptor->close();
  connectionAccept.reset();
  if(!isExit)
  {
    isExit=true;
    ioService->reset();
    ioService->stop();
    if(thread.joinable()) thread.join();
  }
}


Грубо говоря у меня есть функция release():

void WaitingPoint::release(void)
{
  if(isRemoved) return;
  isRemoved=true;
  mConnectionPoints.lock();
  size_t len=vConnectionPoints.size();
  for(size_t i=0;i<len;i++)
  {
    auto& item=vConnectionPoints[i];
    item->isRemoved=true;
    item->free();
  }
  vConnectionPoints.clear();
  mConnectionPoints.unlock();
  std::shared_ptr<WaitingPoint> p(shared_from_this());
  Core::instance->freeWaitingPoint(this);
  free();
}


Вызовом которой я удаляю сервер. Делаю я это вот так:

void release(void)
{
  if(waitingPoint) waitingPoint->release();
  while(true);
  if(connectionPoint) connectionPoint->release();
  if(core) core->release();
  std::cout<<std::endl<<"Press Enter for exit...";
  std::cin.get();
}


Тут я намеренно зациклил программу. В общем после выполнения задуманного мной сценария и дохода до бесконечного цикла, программа в какой-то момент (уже вися основным потоком в бесконечном цикле) рушится с сообщением:



И останавливается вот тут:



То есть проблема с потоком. В чём может быть ошибка и как её исправить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.