Всем доброго дня!
Использую поток от 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();
}
Тут я намеренно зациклил программу. В общем после выполнения задуманного мной сценария и дохода до бесконечного цикла, программа в какой-то момент (уже вися основным потоком в бесконечном цикле) рушится с сообщением:
И останавливается вот тут:
То есть проблема с потоком. В чём может быть ошибка и как её исправить?