Boost logo

Boost Users :

From: KSpam (keesling_spam_at_[hidden])
Date: 2007-10-03 13:19:58


Woody,

All you have to do is protect the shared data with a boost::mutex. You will
want to protect any methods that access or mutate the data. Boost has a
nice "scoped_lock". The scoped_lock will set a lock and automatically unset
the lock when it goes out of scope. If multiple threads reach this code, the
first thread will set the lock and the other threads will wait until the lock
is unset. This effectively makes the section of code protected by a
scoped_lock single threaded. Here is a quick-and-dirty example:

class ThreadSafeData
{
public:
    typedef std::vector<float> FloatVector;

    // Accessor (return by value)
    FloatVector getFloats (void) const
    {
        boost::mutex::scoped_lock lock(m_Mutex);
        return m_Floats;
    }

    // Mutator
    void addFloat (float value)
    {
        boost::mutex::scoped_lock lock(m_Mutex);
        m_Floats.push_back(value);
    }

    // Mutator
    void clearFloats (void)
    {
         boost::mutex::scoped_lock lock(m_Mutex);
        m_Floats.clear();
    }

private:
    boost::mutex m_Mutex;
    FloatVector m_Floats;
}

Notice I am returning data by value instead of const reference! You do not
want multiple threads keeping references around to shared data. Also, notice
that this code does not concern itself with how the threads are created. It
simply takes care of protecting the data from multiple threads (however they
are created).

I hope that this helps!

Justin

On Wednesday 03 October 2007 09:44:34 Steven Woody wrote:
> On 10/2/07, Kirit Sælensminde <kirit.saelensminde_at_[hidden]> wrote:
> > Steven Woody wrote:
> > > hi,
> > >
> > > i am doing a job and considering if boost.thread can help.
> > >
> > > ...
> > >
> > > in breif, you can think my code in a way of producer/consumer pattern.
> > > the producer is a rouine which will be called by many threads ( which
> > > are actaully connected sockets created by a listening socket ), and
> > > the consumer routine will be called by another thread ( which is
> > > actually GUI's main thread ). what i expected is:
> > >
> > > 1, only one producer can write to the shared data;
> > > 2, when a producer is writting, other producers have to busy waiting;
> > > and the GUI thread should immediately exit;
> > > 3, when GUI thread is reading, no producer can write to the shared
> > > data;
> >
> > From the sound of what you're trying to do then yes. This page shows
> > how to make a queue and add and remove items from it.
> > http://www.boostcookbook.com/Recipe:/1234841
> >
> >
> > K
>
> god! i found the boost's documentation is very hard to read, it is not
> for a beginner! and, it seems if i want to use the mutex and lock, the
> threads themself have to be created using boost, is it true? it's
> impossible to me since the threads had been created by other member of
> our team and i am just writing library codes for them.
>
> any other inputs will be highly appreciated!
>
> -
> woody


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