
On 10/4/07, Steven Woody
On 10/4/07, KSpam
wrote: 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
sorry for i repost below message for i really need your kind help. ----------------------- thanks a lot for your code which cleared most of my question. while the scoped_lock can has a thread block when a mutex object is being locked by another thread, can you show me additional example about how to let a thread immediately exit when it found a mutex object is being used? i mean that one of thread in our application is actually the GUI main thread, it will access the shared data in it's OnIdel event handler, so i hope it will be never blocked, when resources are not available, i hope it can immediately exist and try again some times later. does the boost support this kind of feature? thanks. -------------------------