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@gmail.com> 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