为ling::shared_mutex添加setResource
This commit is contained in:
@@ -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
|
||||||
|
|||||||
34
main.cpp
34
main.cpp
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -270,4 +266,4 @@ TEST(位图, 位图测试) {
|
|||||||
bitmap.clear(20);
|
bitmap.clear(20);
|
||||||
for (int i = 0; i < bitmap.getSize(); i++)
|
for (int i = 0; i < bitmap.getSize(); i++)
|
||||||
ASSERT_FALSE(bitmap.test(i));
|
ASSERT_FALSE(bitmap.test(i));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user