
I'm trying to figure out why a call to boost::io_service::post might be failing. My program is multithreaded, and has a periodic "timing event" that is triggered. The timing event calls "Service.post(&OnSignal);" to execute a handler, while another thread runs the service. Using this design, I can post an event from any thread without worrying about explicit resource locking. My question is, why does my call to Service.post always fail? I know it is failing because the function that I post never gets called. There is not explicit return code or thrown exception to indicate that there is a problem. Below is an example of what I'm trying to do. Inside main(), there is a commented call to "Service.post(&OnSignal);". Uncommenting that line results in a successful post to the Service, which eventually calls OnSignal, (but only once, obviously). Why does that call work, but not the call in TimingSignalThread()? #include <iostream> #include <boost/asio.hpp> #include <boost/thread/thread.hpp> using namespace std; // This is the service responsible for queuing the events. boost::asio::io_service Service; // This is the function that should be periodically queued by the TimingSignalThread. void OnSignal() { cout << "Got timing signal"; } // This function runs in its own thread, and periodically posts OnSignal() to the Service. void TimingSignalThread() { boost::this_thread::disable_interruption di; // Run until interrupted by <enter>. while(!boost::this_thread::interruption_requested()) { cout << "."; boost::this_thread::sleep(boost::posix_time::millisec(500)); Service.post(&OnSignal); // This post is never successful. } } // This function runs in its own thread, and executes all posts. void ServiceRunner() { Service.run(); } int main() { boost::thread TimingThread(&TimingSignalThread); boost::thread ServiceThread(&ServiceRunner); // Why does 'post()' work here, but not in TimingSignalThread()? // Uncommenting the following line results in a single successful post to OnSignal. // Service.post(&OnSignal); cin.get(); // Press enter to end the program. TimingThread.interrupt(); TimingThread.join(); Service.stop(); ServiceThread.join(); cout << "Joined all threads." << endl; return 0; }