#include #pragma GCC visibility push(default) #include #include #include #pragma GCC visibility pop using namespace std; boost::shared_mutex mutex_; int pos = 0; time_t startTime = time(0); int getSleepTime() { static int sleepTimes [12] = {5, 5, 5, 5, 6, 6, 7, 8, 8, 8, 8, 8}; return sleepTimes[pos++]; } #define whoAndWhen __func__ << "(" << myPos << ") at " << (time(0) - startTime) void reader() { int myPos = pos; int sleepTime = getSleepTime(); cerr << whoAndWhen << " sleeping " << sleepTime << endl; ::sleep(sleepTime); cerr << " " << whoAndWhen << " trying to acquire lock " << endl; boost::shared_lock sharedLock(mutex_); cerr << whoAndWhen << " got lock " << endl; ::sleep(5); cerr << " " << whoAndWhen << " finished " << endl; } void writer() { int myPos = pos; int sleepTime = getSleepTime(); cerr << whoAndWhen << " sleeping " << sleepTime << endl; ::sleep(sleepTime); cerr << " " << whoAndWhen << " trying to acquire lock " << endl; boost::unique_lock uniqueLock(mutex_); cerr << whoAndWhen << " got lock " << endl; ::sleep(5); cerr << " " << whoAndWhen << " finished " << endl; } int main() { boost::thread_group threads; for (int i = 0; i < 2; ++i) { threads.create_thread(reader); } for (int i = 0; i < 2; ++i) { threads.create_thread(writer); } for (int i = 0; i < 2; ++i) { threads.create_thread(reader); } threads.create_thread(writer); for (int i = 0; i < 2; ++i) { threads.create_thread(reader); } // Wait for all threads to finish threads.join_all(); }