Boost logo

Boost Users :

Subject: [Boost-users] [Thread] io_service post is unsuccessful
From: Dylan Klomparens (dylan.klomparens_at_[hidden])
Date: 2009-10-28 16:11:09


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



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net