实现方法
- 使用
std::mutex
:在C++中,可以使用std::mutex
来保护共享资源。在const
成员函数中,对共享资源的访问和操作前后加锁和解锁,以确保线程安全。
#include <iostream>
#include <mutex>
class MyClass {
private:
static int sharedResource;
static std::mutex mtx;
public:
const int accessSharedResource() const {
std::lock_guard<std::mutex> lock(mtx);
// 访问和操作共享资源
++sharedResource;
return sharedResource;
}
};
int MyClass::sharedResource = 0;
std::mutex MyClass::mtx;
- 使用
std::shared_mutex
(C++17及以上):如果共享资源的读取操作远多于写入操作,可以使用std::shared_mutex
来提高性能。读操作使用std::shared_lock
,写操作使用std::unique_lock
。
#include <iostream>
#include <shared_mutex>
class MyClass {
private:
static int sharedResource;
static std::shared_mutex mtx;
public:
const int readSharedResource() const {
std::shared_lock<std::shared_mutex> lock(mtx);
return sharedResource;
}
int modifySharedResource() {
std::unique_lock<std::shared_mutex> lock(mtx);
++sharedResource;
return sharedResource;
}
};
int MyClass::sharedResource = 0;
std::shared_mutex MyClass::mtx;
优缺点分析
- 使用
std::mutex
的优缺点
- 优点:
- 简单直接:实现方式简单,容易理解和维护,适用于各种场景。
- 通用性强:能有效保护共享资源,防止多线程竞争条件。
- 缺点:
- 性能瓶颈:如果多个线程频繁访问共享资源,由于每次访问都需要加锁解锁,会导致性能下降,特别是在高并发场景下。
- 使用
std::shared_mutex
的优缺点
- 优点:
- 读性能提升:对于读多写少的场景,允许多个线程同时进行读操作,大大提高了并发性能。
- 缺点:
- 复杂性增加:代码实现相对复杂,需要区分读操作和写操作,对开发者要求更高。
- 写操作开销:写操作仍然需要独占锁,在写操作频繁时,可能会导致读操作等待,性能反而不如
std::mutex
。