Boost.Asio zugriff auf Listen



  • Hallo zusammen, mal schauen ob ich das Problem sinnvoll erläutern kann. Ggf kann mir dann auch jemand helfen die Asynchronität von Boost.ASIO zu erklären.

    Folgender Quelltext:

    void CNetInterface::addCommand( boost::shared_ptr<CBasicServerCommand> command )
    {
        bool write_in_progress = !sendQueue.empty();
        command->addHeader();
        sendQueue.push_back(command);
    	try
    	{
    		if (!write_in_progress && online)
    		{
    			boost::asio::async_write(socket,boost::asio::buffer(sendQueue.front()->cmdData(),sendQueue.front()->getLength()),
    				boost::bind(&CNetInterface::handle_write, shared_from_this(),boost::asio::placeholders::error));
    		}
    	}
    	catch ( std::exception ex )
    	{
            std::cerr<<"addCommand error during write: "<<ex.what()<<std::endl;
    		closeConnection();
    	}
    
    }
    
    void CNetInterface::handle_write(const boost::system::error_code& error)
    {
    	try
    	{
    		if ( !error )
    		{
                if ( online )
                {
                    sendQueue.pop_front();
                    if ( !sendQueue.empty() && online)
                    {
                        boost::asio::async_write(socket,boost::asio::buffer(sendQueue.front()->cmdData(),sendQueue.front()->getLength()),
                            boost::bind(&CNetInterface::handle_write, shared_from_this(),boost::asio::placeholders::error));
                    }
                }
    		}
    		else
    		{    
                std::cerr<<"handle_write error during write: "<<error.message()<<" :"<<error<<std::endl;
    			closeConnection();
    		}
    	}
    	catch ( std::exception ex )
    	{
            std::cout<<"caugth Exception on handle_write"<<ex.what()<<std::endl;
    		closeConnection();
    	}
    }
    

    Nun scheint es auf zu treten das auf einmal der Server keine Befehle mehr sendet (das funktioniert ja mit den beiden Funktionen).
    Die Theorie ist folgendes. das run_service() steckt in einen Separaten boost Thread.
    Daher wird alles was mit dem netzwerk zu tun hat, unabhängig von der main bearbeitet. Die main jedoch führt als einziges addCommand aus und steckt dadurch Befehle in die liste. Daher ists also wohl ein typisches Synchronisationsproblem. D.H. ich muss das wohl mit Mutexen absichern. Ist das egal welche Form ich nehme? Könnte ich auch posix_mutexe nehmen? Muss ich boost::mutexe nehmen?



  • Es ist noch nicht ganz klar, was dein Problem tatsaechlich ist. Vielleicht ist es eine Kombination aus mehreren.

    Frage hier ist: Was bedeutet Server sendet keine Befehle mehr sendet? Ist die Liste leer oder noch was drin? Laeuft einfach die ASIO-Loop nicht mehr? Um hier helfen zu koennen, werden mehr Infos benoetigt.

    Bezueglich deines Synchronisierungsproblems koenntest Du einen zyklischen Puffer verwenden. Einen der auch Thread-Safe ist, kannst Du unter http://www.boost.org/doc/libs/1_40_0/libs/circular_buffer/doc/circular_buffer.html#boundedbuffer finden.

    Gruss


Anmelden zum Antworten