生活随笔
收集整理的這篇文章主要介紹了
C++多线程快速入门(四)shared_mutex以及读写锁应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在前面的三講中我們使用的mutex都是普通的std::mutex,這里介紹一下shared_mutex,版本為C++17
std::shared_mutex的底層實現時操作系統提供的讀寫鎖,在讀多寫少的情況下,該shared_mutex比mutex更加高效。
它提供了常用的四種方法:
lock和unlock分別用于獲取寫鎖和解除寫鎖
lock_shared和unlock_shared分別用于獲取讀鎖和解除讀鎖
寫鎖模式稱為排他鎖,讀鎖模式稱為共享鎖。
c++11和c++14標準中分別引入unique_lock和shared_lock兩個類模板配合shared_mutex使用。
對象在構造時自動對std::shared_mutex加鎖,析構時自動對其解鎖。
前者用于加解寫鎖,后者用于加解讀鎖。
當然在第二講中,我們也談到了unique_lock對于普通鎖mutex的一種應用,當時是和std::lock_guard對比的。
下面是案例代碼,對于共享資源我們創建多個讀線程和一個寫線程,分別使用std::mutex和std::shared_mutex做一下性能測試。
#include <iostream>
#include <thread>
#include <mutex>
#include <shared_mutex>
#define READER_THREAD_COUNT 4
#define LOOP_COUNT 500000class shared_mutex_counter {
private:mutable std
::shared_mutex m_mutex
;unsigned int m_value
= 0;
public:shared_mutex_counter() = default;~shared_mutex_counter() = default;unsigned int get() const{std
::shared_lock
<std
::shared_mutex
> lock(m_mutex
);return m_value
;}void incremet() {std
::unique_lock
<std
::shared_mutex
> lock(m_mutex
);m_value
++;}
};class mutex_counter {
private:mutable std
::mutex m_mutex
;unsigned int m_value
= 0;
public:mutex_counter() = default;~mutex_counter() = default;unsigned int get() const{std
::unique_lock
<std
::mutex
> lock(m_mutex
);return m_value
;}void incremet(){std
::unique_lock
<std
::mutex
> lock(m_mutex
);m_value
++;}
};
void test_shared_mutex()
{shared_mutex_counter counter
;unsigned int temp
;auto write
= [&counter
]() {for (int i
= 0; i
< LOOP_COUNT
; i
++) {counter
.incremet();}};auto read
= [&counter
, &temp
]() {for (int i
= 0; i
< LOOP_COUNT
; i
++) {temp
= counter
.get();}};std
::thread
** tarray
= new std
::thread
* [READER_THREAD_COUNT
];clock_t start
= clock();for (int i
= 0; i
< READER_THREAD_COUNT
; i
++) {tarray
[i
] = new std
::thread(read
);}std
::thread
tw(write
);for (int i
= 0; i
< READER_THREAD_COUNT
; i
++) {tarray
[i
]->join();}tw
.join();clock_t end
= clock();std
::cout
<< "test shared_mutex" << std
::endl
;std
::cout
<< "thread count " << READER_THREAD_COUNT
<< std
::endl
;std
::cout
<< "spend time " << end
- start
<< std
::endl
;std
::cout
<< "result : " << counter
.get() << std
::endl
;std
::cout
<< "temp : " << temp
<< std
::endl
;
}
void test_mutex()
{mutex_counter counter
;unsigned int temp
;auto write
= [&counter
]() {for (int i
= 0; i
< LOOP_COUNT
; i
++) {counter
.incremet();}};auto read
= [&counter
, &temp
]() {for (int i
= 0; i
< LOOP_COUNT
; i
++) {temp
= counter
.get();}};std
::thread
** tarray
= new std
::thread
* [READER_THREAD_COUNT
];clock_t start
= clock();for (int i
= 0; i
< READER_THREAD_COUNT
; i
++) {tarray
[i
] = new std
::thread(read
);}std
::thread
tw(write
);for (int i
= 0; i
< READER_THREAD_COUNT
; i
++) {tarray
[i
]->join();}tw
.join();clock_t end
= clock();std
::cout
<< "test mutex" << std
::endl
;std
::cout
<< "thread count " << READER_THREAD_COUNT
<< std
::endl
;std
::cout
<< "spend time " << end
- start
<< std
::endl
;std
::cout
<< "result : " << counter
.get() << std
::endl
;std
::cout
<< "temp : " << temp
<< std
::endl
;
}int main() {test_mutex();std
::cout
<< std
::endl
;test_shared_mutex();return 0;
}
測試結果如下:
test mutex
thread count
8
spend time
1312
result
: 500000
temp
: 500000test shared_mutex
thread count
8
spend time
601
result
: 500000
temp
: 475766
有個問題,我同樣程序在windows的clion和vs上跑結果差異較大,clion跑出來的結果shared_mutex耗時比mutex多好多。
linux下的vscode跑出來結果正常。
總結
以上是生活随笔為你收集整理的C++多线程快速入门(四)shared_mutex以及读写锁应用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。