Boost logo

Boost Users :

From: Ben Hutchings (ben.hutchings_at_[hidden])
Date: 2004-03-11 14:02:17


Jerry Swan <jeremiah.s_at_[hidden]> wrote:
> I'd like to be able to issue a call to std::system that will time-out
> after a specified period. Is it possible to achieve this using the
> boost::threads library?

You can stop waiting for it to complete, but you can't terminate the
external program.

> If so could someone kindly sketch how this might be achieved?

You need to have the calling thread create a synchronised flag
(bool with condition, protected by mutex) and a child thread that
calls system() and then sets the flag when that returns. The
original thread then performs a timed wait for the flag to be set.

Here's my solution. The synchronised flag can be encapsulated as an
"event" like this:

    struct one_time_event
    {
    public:
        one_time_event()
            : flag(false)
        {
        }
        void trigger()
        {
            boost::mutex::scoped_lock lock(mutex);
            flag = true;
            cond.notify_all();
        }
        void wait()
        {
            boost::mutex::scoped_lock lock(mutex);
            while (!flag)
                cond.wait(lock);
        }
        bool timed_wait(boost::xtime & time)
        {
            boost::mutex::scoped_lock lock(mutex);
            while (!flag)
                if (!cond.timed_wait(lock, time))
                    return false;
            return true;
        }
       
    private:
        boost::mutex mutex;
        boost::condition cond;
        bool flag;
    };

(This is a basic event that you use once and then throw away. More
complex event classes are possible but harder to use correctly.)

Using this class it's really very easy:

    void call_system(const char * command, one_time_event & event)
    {
        std::system(command);
        event.trigger();
    }

    bool system_with_time_limit(const char * command, boost::xtime &
time)
    {
        one_time_event event;
        boost::thread thread(
            boost::bind(call_system, command, boost::ref(event)));
        return event.timed_wait(time);
    }

Ben.


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