類似於shared_ptr Assertion px != 0 failedstd :: vector :: erase()(多線程)'assertion'px!= 0'失敗。'
我正在寫一個遊戲服務器,它產生一個新線程來處理每個用戶會話。主線程有一個UserSession共享指針的std :: vector。另一個線程定期從這個向量中刪除死的會話,但在執行std :: vector :: erase()時失敗。我無法找出我生活中的錯誤。
的錯誤是:
Prototype2:/usr/include/boost/smart_ptr/shared_ptr.hpp:653:類型名稱的boost ::詳細:: sp_member_access ::類型 的boost :: shared_ptr的::運算符 - >()const [with T = UserSession; typename boost :: detail :: sp_member_access :: type = UserSession *]: 聲明'px!= 0'失敗。 中止(核心轉儲)
相關的代碼是:
void GameServer::start()
{
int sessionid;
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port_));
boost::thread(&GameServer::session_monitor, this);
for (;;)
{
socket_shptr socket(new tcp::socket(io_service));
acceptor.accept(*socket);
sessionid = numsessions_++;
UserSession* usession = new
UserSession(socket, sessionid, io_service);
session_shptr session(usession);
sessions_mutex_.lock();
sessions_.push_back(session);
sessions_mutex_.unlock();
std::cout << "Starting session for client " <<
get_client_ip(*socket) << std::endl;
session->start();
}
}
void GameServer::session_monitor()
{
for (;;)
{
boost::this_thread::sleep(boost::posix_time::seconds(10));
std::cout << "Removing dead user sessions" << std::endl;
sessions_mutex_.lock();
for (std::vector<session_shptr>::iterator it = sessions_.begin();
it != sessions_.end(); ++it)
{
if ((*it)->is_dead())
{
std::cout << "Removing session: " << (*it)->id() <<
std::endl;
sessions_.erase(it);
}
}
sessions_mutex_.unlock();
}
}
我也意識到這個代碼還有其他的錯誤,比如std :: cout的併發使用。 – coffeebean
無關:總是使用'make_shared'。使用'std :: lock_guard'而不是直接鎖定。 – Casey