You can create an explicit thread an invoke io_service::run() there, as you've shown above. No need to inherit thread, boost::thread/std::thread object accepts the thread procedure as a parameter. In general, it's quite hard to tell what the problem is without seeing your code. If you can't make a small self-contained sample that reproduces the issue, try posting your real code.
Allright -- I tried to simplify things as much as possible. My app is a music live music streamer, which sends and receives UDP audio data. I will start with the sender first. Please note that any network related data (io_service, endpoint, socket etc.) is all defined within a struct called dFC, which belongs to a class called sj - hence I address them via sj->dFC->... I have an audio callback thread, which sends a UDP packet in a time interval of 10.8 ms: -------------- static int callback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer,void *data ){ sj::callbackdata *my; my = (sj::callbackdata *) data; ///SENDER if (my->streaming) my->mySender->sendIt(buffer); ///FURTHER STUFF WITHOUT RELEVANCE FOR NOW ... } -------------
From this function I call the class mySender, which contains the async_send command and the handler:
------------ void sender::sendHandler(const boost::system::error_code& error,std::size_t bytes_transferred){ cout << "TRIGGER !" << endl; } void sender::sendIt(char *charBuffer){ cout << "SENDING" << endl; sj->dFC->s->async_send_to(boost::asio::buffer(charBuffer, sj->dFC->sendBytes), *sj->dFC->e, boost::bind(&sender::sendHandler,this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); sj->dFC->io_service.run(); } ----------------- The good news are that it works - the bad news are: It works only once so that the console output looks like this: SENDING TRIGGER SENDING SENDING SENDING SENDING SENDING SENDING ... I believe I am not using the io_service correctly. Can you help ? Thanks Alex