首页 > 代码库 > multithreading - Reader/Writer Locks in C++
multithreading - Reader/Writer Locks in C++
You Only Need To Note This: only 1 single thread can acquire an upgrade_lock at one time.
others are very straightforward.
96 vote | 1800 INFORMATION is more or less correct, but there are a few issues I wanted to correct. boost::shared_mutex _access;void reader(){ boost::shared_lock< boost::shared_mutex > lock(_access); // do work here, without anyone having exclusive access}void conditional_writer(){ boost::upgrade_lock< boost::shared_mutex > lock(_access); // do work here, without anyone having exclusive access if (something) { boost::upgrade_to_unique_lock< boost::shared_mutex > uniqueLock(lock); // do work here, but now you have exclusive access } // do more work here, without anyone having exclusive access}void unconditional_writer(){ boost::unique_lock< boost::shared_mutex > lock(_access); // do work here, with exclusive access}
Also Note, unlike a shared_lock, only a single thread can acquire an upgrade_lock at one time, even when it isn‘t upgraded (which I thought was awkward when I ran into it). So, if all your readers are conditional writers, you need to find another solution. | ||
Test code:
1 /*‘‘‘ 2 3 [[[[[[[[[[[[[[[ ]]]]]]]]]]]]]]] 4 [:::::::::::::: ::::::::::::::] 5 [:::::::::::::: ::::::::::::::] 6 [::::::[[[[[[[: :]]]]]]]::::::] 7 [:::::[ ]:::::] 8 [:::::[ ]:::::] 9 [:::::[ ]:::::] 10 [:::::[ ]:::::] 11 [:::::[ Created on Dec 25, 2014 (merry christmas) ]:::::] 12 [:::::[ @author: ScottGu<150316990@qq.com, ]:::::] 13 [:::::[ gu.kai.66@gmail.com> ]:::::] 14 [:::::[ performance tested: ]:::::] 15 [:::::[ environment: 64bit win7, i7-4800MQ, 8GB ]:::::] 16 [:::::[ ]:::::] 17 [:::::[ ]:::::] 18 [:::::[ ]:::::] 19 [:::::[ ]:::::] 20 [::::::[[[[[[[: :]]]]]]]::::::] 21 [:::::::::::::: ::::::::::::::] 22 [:::::::::::::: ::::::::::::::] 23 [[[[[[[[[[[[[[[ ]]]]]]]]]]]]]]]] 24 25 ‘‘‘*/ 26 27 #pragma once 28 29 #include "stdafx.h" 30 #include <cstdlib> 31 #include <iostream> 32 #include <string> 33 34 #include "boost/bind.hpp" 35 #include "boost/smart_ptr.hpp" 36 #include "boost/asio.hpp" 37 #include "boost/thread/thread.hpp" 38 #include "boost/date_time/posix_time/ptime.hpp" 39 #include <boost/format.hpp> 40 41 #include <boost/thread/mutex.hpp> 42 #include <boost/thread/locks.hpp> 43 #include <boost/algorithm/string/predicate.hpp> 44 #include <boost/exception/diagnostic_information.hpp> 45 #include <boost/exception_ptr.hpp> 46 #include <boost/thread/shared_mutex.hpp> 47 #include <boost/lexical_cast.hpp> 48 49 50 typedef boost::shared_mutex Lock; 51 typedef boost::unique_lock< Lock > WriteLock_uniq; 52 typedef boost::upgrade_lock< Lock > WriteLock_upgrade; 53 typedef boost::shared_lock< Lock > ReadLock; 54 55 Lock myLock; 56 57 58 59 void writer_thread() { 60 WriteLock_uniq w_lock(myLock); 61 std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 62 std::cout << "writer holding lock, threadid " << threadId << " " << std::endl; 63 Sleep(1000); 64 std::cout << "END, threadid " << threadId << " " << std::endl; 65 66 }; 67 68 void writer_upgrade_thread() { 69 WriteLock_upgrade w_lock(myLock); 70 std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 71 std::cout << "UPgraded writer holding lock, threadid " << threadId << " " << std::endl; 72 Sleep(1000); 73 std::cout << "END, threadid " << threadId << " " << std::endl; 74 75 }; 76 77 78 void reader_thread() { 79 ReadLock r_lock(myLock); 80 std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 81 std::cout << "reader holding lock, threadid " << threadId << " " << std::endl; 82 Sleep(1000); 83 std::cout << "END, threadid " << threadId << " " << std::endl; 84 85 }; 86 87 88 int test_RW_lock() 89 { 90 boost::thread_group threads; 91 92 threads.create_thread(boost::bind(reader_thread)); 93 threads.create_thread(writer_upgrade_thread); 94 threads.create_thread(writer_upgrade_thread); 95 threads.create_thread(boost::bind(reader_thread)); 96 threads.create_thread(boost::bind(reader_thread)); 97 threads.create_thread(boost::bind(reader_thread)); 98 threads.create_thread(boost::bind(reader_thread)); 99 100 threads.create_thread(writer_upgrade_thread);101 threads.create_thread(writer_upgrade_thread);102 threads.create_thread(boost::bind(writer_thread));103 104 threads.join_all();105 }
multithreading - Reader/Writer Locks in C++
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。