为ling::shared_mutex添加setResource

This commit is contained in:
2024-11-24 17:54:34 +08:00
parent 8e248d088f
commit 06193c5f7d
2 changed files with 30 additions and 28 deletions

View File

@@ -10,7 +10,6 @@
#include <shared_mutex> #include <shared_mutex>
namespace ling { namespace ling {
template<typename T> template<typename T>
class ResourceReadOnly; class ResourceReadOnly;
@@ -37,6 +36,11 @@ namespace ling {
shared_mutex &operator=(const shared_mutex &) = delete; shared_mutex &operator=(const shared_mutex &) = delete;
void setResource(const T &&value) {
ResourceCompletely<T> lock_completely = lock();
this->resource = value;
}
ResourceReadOnly<CT> lock_shared() { ResourceReadOnly<CT> lock_shared() {
mutex.lock_shared(); mutex.lock_shared();
@@ -63,11 +67,16 @@ namespace ling {
} }
}; };
template<typename T, typename ...Args> template<typename T, typename... Args>
ling::shared_mutex<T> make_shared_mutex(Args &&... args) { ling::shared_mutex<T> make_shared_mutex(Args &&... args) {
return ling::shared_mutex<T>(std::move(T(std::forward<Args>(args)...))); return ling::shared_mutex<T>(std::move(T(std::forward<Args>(args)...)));
} }
template<typename T, typename CT, typename... Args>
ling::shared_mutex<T, CT> make_shared_mutex(Args &&... args) {
return ling::shared_mutex<T, CT>(std::move(T(std::forward<Args>(args)...)));
}
/// 资源的读写代理 /// 资源的读写代理
template<typename T> template<typename T>
class ResourceCompletely { class ResourceCompletely {
@@ -77,11 +86,11 @@ namespace ling {
public: public:
ResourceCompletely(std::shared_mutex *mutex, T *resource) ResourceCompletely(std::shared_mutex *mutex, T *resource)
: mutex(mutex), resource(resource) { : mutex(mutex), resource(resource) {
} }
ResourceCompletely() ResourceCompletely()
: mutex(nullptr), resource(nullptr) { : mutex(nullptr), resource(nullptr) {
} }
ResourceCompletely(const ResourceCompletely &) = delete; ResourceCompletely(const ResourceCompletely &) = delete;
@@ -125,11 +134,11 @@ namespace ling {
public: public:
ResourceReadOnly(std::shared_mutex *mutex, const T *const resource) ResourceReadOnly(std::shared_mutex *mutex, const T *const resource)
: mutex(mutex), resource(resource) { : mutex(mutex), resource(resource) {
} }
ResourceReadOnly() ResourceReadOnly()
: mutex(nullptr), resource(nullptr) { : mutex(nullptr), resource(nullptr) {
} }
ResourceReadOnly(const ResourceReadOnly &) = delete; ResourceReadOnly(const ResourceReadOnly &) = delete;
@@ -162,10 +171,7 @@ namespace ling {
const T *operator->() const { const T *operator->() const {
return resource; return resource;
} }
}; };
} // ling } // ling
#endif //DATASTRUCT_SHARED_MUTEX_H_04 #endif //DATASTRUCT_SHARED_MUTEX_H_04

View File

@@ -43,28 +43,25 @@ public:
TEST(, 1) { TEST(, 1) {
auto mutex = ling::shared_mutex<mutex_test>(mutex_test()); auto mutex = ling::shared_mutex<mutex_test>(mutex_test());
mutex.setResource(mutex_test());
auto ptr = std::make_shared<mutex_test>(); auto ptr = std::make_shared<mutex_test>(); {
{
auto lock = mutex.lock(); auto lock = mutex.lock();
lock->test(); lock->test();
lock->test_const(); lock->test_const();
} } {
{
auto shared = mutex.lock_shared(); auto shared = mutex.lock_shared();
auto shared2 = mutex.lock_shared(); auto shared2 = mutex.lock_shared();
shared->test_const(); shared->test_const();
shared2->test_const(); shared2->test_const();
} } {
{
auto lock = mutex.try_lock(); auto lock = mutex.try_lock();
ASSERT_TRUE(lock); ASSERT_TRUE(lock);
auto lock_2 = mutex.try_lock(); auto lock_2 = mutex.try_lock();
ASSERT_FALSE(lock_2); ASSERT_FALSE(lock_2);
auto lock_3 = mutex.try_lock_shared(); auto lock_3 = mutex.try_lock_shared();
ASSERT_FALSE(lock_3); ASSERT_FALSE(lock_3);
} } {
{
auto lock = mutex.try_lock_shared(); auto lock = mutex.try_lock_shared();
ASSERT_TRUE(lock); ASSERT_TRUE(lock);
auto lock_2 = mutex.try_lock(); auto lock_2 = mutex.try_lock();
@@ -83,7 +80,6 @@ TEST(排序, 堆排序测试) {
list.reserve(DATA_SIZE); list.reserve(DATA_SIZE);
std::uniform_int_distribution<> dis(1, DATA_SIZE * 10); std::uniform_int_distribution<> dis(1, DATA_SIZE * 10);
for (int i = 0; i < DATA_SIZE; i++) { for (int i = 0; i < DATA_SIZE; i++) {
list.push_back(dis(gen)); list.push_back(dis(gen));
} }
StartStating(start); StartStating(start);
@@ -114,15 +110,15 @@ TEST(红黑树, 插入测试) {
/*for (int i = 0; i < 3000; i++) { /*for (int i = 0; i < 3000; i++) {
vec.push_back(dist(gen)); vec.push_back(dist(gen));
}*/ }*/
vec.push_back(0x2e27b3d26bc); //1 317 vec.push_back(0x2e27b3d26bc); //1 317
vec.push_back(0x6ff71223ecc); //2 769 vec.push_back(0x6ff71223ecc); //2 769
vec.push_back(0x2d69a2c3138); //3 312 vec.push_back(0x2d69a2c3138); //3 312
vec.push_back(0x2de3d825c0); //4 197 vec.push_back(0x2de3d825c0); //4 197
vec.push_back(0x1ecd65c2c5); //5 132 vec.push_back(0x1ecd65c2c5); //5 132
vec.push_back(0x77561e1ec5e); //6 820 vec.push_back(0x77561e1ec5e); //6 820
vec.push_back(0xeb31b2ddab); //7 101 vec.push_back(0xeb31b2ddab); //7 101
vec.push_back(0x98b4038275); //8 655 vec.push_back(0x98b4038275); //8 655
vec.push_back(0x16243d02489); //9 152 vec.push_back(0x16243d02489); //9 152
for (unsigned long i: vec) { for (unsigned long i: vec) {
tree.insert(i); tree.insert(i);
} }