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;
}