Here is a quick example showing how mutex helps in doing a synchronous access on shared resource. We are using boost::mutex::scoped_lock here, which ensures that the ownership of the mutex object is relinquished even in case the code following the lock throws an exception, thus preventing possible thread deadlocks.
#include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp> #include <boost/bind.hpp> #include <iostream> //Compile using : g++ program.cpp -lboost_thread boost::mutex io_mutex; void count(int id) { for (int i = 0; i < 5; ++i) { boost::mutex::scoped_lock lock(io_mutex); std::cout << id << ": " << i << std::endl; } } void countWithoutMutex(int id) { for (int i = 0; i < 5; ++i) { std::cout << id << ": " << i << std::endl; } } int main(int argc, char* argv[]) { std::cout << "The wrong way\n"; boost::thread thrd1( boost::bind(&countWithoutMutex, 1)); boost::thread thrd2( boost::bind(&countWithoutMutex, 2)); thrd1.join(); thrd2.join(); std::cout << "Now the right way\n"; boost::thread thrd3( boost::bind(&count, 3)); boost::thread thrd4( boost::bind(&count, 4)); thrd3.join(); thrd4.join(); return 0; }
Output:
The wrong way 2: 01: 0 1: 1 1: 2 1: 3 1: 4 2: 1 2: 22 : 3 2: 4 Now the right way 3: 0 3: 1 3: 2 3: 3 3: 4 4: 0 4: 1 4: 2 4: 3 4: 4
No comments:
Post a Comment