12.2. Making a Resource Thread-Safe

Problem

You are using multiple threads in a program and you need to ensure a resource is not modified by more than one thread at a time. In general, this process is called making the resource thread-safe, or serializing access to it.

Solution

Use the class mutex, defined in boost/thread/mutex.hpp, to synchronize access among threads. Example 12-2 shows a simple use of a mutex object to control concurrent access to a queue.

Example 12-2. Making a class thread-safe

#include <iostream> #include <boost/thread/thread.hpp> #include <string> // A simple queue class; don't do this, use std::queue template<typename T> class Queue { public: Queue() {} ~Queue() {} void enqueue(const T& x) { // Lock the mutex for this queue boost::mutex::scoped_lock lock(mutex_); list_.push_back(x); // A scoped_lock is automatically destroyed (and thus unlocked) // when it goes out of scope } T dequeue() { boost::mutex::scoped_lock lock(mutex_); if (list_.empty()) throw "empty!"; // This leaves the current scope, so the T tmp = list_.front(); // lock is released list_.pop_front(); return(tmp); } // Again: when scope ends, mutex_ is unlocked private: std::list<T> list_; boost::mutex mutex_; }; Queue<std::string> queueOfStrings; void sendSomething() { std::string s; for (int i = 0; i < 10; ++i) { queueOfStrings.enqueue("Cyrus"); } } void recvSomething() { std::string s; for (int i = 0; i < 10; ++i) { try {s = queueOfStrings.dequeue();} catch(...) {} } } int main() { boost::thread ...

Get C++ Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.