请基于上述回答举一个该场景处理线程安全的例子
时间: 2024-10-08 08:11:45 浏览: 28
当涉及到线程安全地访问基类的静态成员时,我们可以使用C++的`std::lock_guard`和`std::mutex`来确保并发环境下的正确操作。假设我们有一个基类`SharedData`,它有一个静态成员变量`count`用于计数操作:
```cpp
#include <mutex>
class SharedData {
private:
static std::atomic<int> count; // 使用原子整型保证原子性
static std::mutex mtx; // 创建互斥锁
public:
// 静态函数,增加计数并锁定
static void increment() {
std::lock_guard<std::mutex> lock(mtx);
count++;
}
// 静态函数,减少计数并锁定
static void decrement() {
std::lock_guard<std::mutex> lock(mtx);
if (count > 0) {
count--;
}
}
static int getCount() { return count; } // 获取当前值
};
std::atomic<int> SharedData::count(0); // 初始化静态原子变量
std::mutex SharedData::mtx; // 初始化静态互斥锁
```
在这个例子中,`increment()` 和 `decrement()` 函数会自动获取锁,只有当持有锁时才能修改`count`。这样就避免了并发环境下的数据竞态条件。每个线程在访问`count`之前都会先获取锁,完成操作后再释放,保证了数据一致性。
阅读全文