线程安全的观察者模式需用互斥锁保护共享状态,避免多线程下注册、注销或通知时的数据竞争。1. 使用std::lock_guard确保attach、detach和notify对观察者列表的操作原子性;2. notify中先复制列表再释放锁,防止回调期间持有锁导致死锁或迭代器失效;3. 建议使用std::shared_ptr或std::weak_ptr管理观察者生命周期,避免悬挂指针;4. 高并发场景可采用std::shared_mutex提升性能,读(notify)用共享锁,写(attach/detach)用独占锁。正确同步与资源管理可有效保障线程安全。

在C++中,观察者模式常用于实现对象间的一对多依赖关系,当被观察对象状态改变时,所有依赖的观察者会自动收到通知。但在多线程环境下,若不加保护,多个线程同时注册、注销观察者或触发通知,可能导致数据竞争和未定义行为。因此,将观察者模式与线程安全结合使用是必要的。
典型的观察者模式包含两个核心角色:
示例代码框架如下:
class Observer {
public:
virtual ~Observer() = default;
virtual void update() = 0;
};
<p>class Subject {
private:
std::vector<Observer*> observers;</p><p>public:
void attach(Observer<em> o) { observers.push_back(o); }
void detach(Observer</em> o) {
observers.erase(
std::remove(observers.begin(), observers.end(), o),
observers.end());
}
void notify() {
for (auto obs : observers) {
obs->update();
}
}
};</p>上述实现在线程环境中存在以下风险:
立即学习“C++免费学习笔记(深入)”;
attach
detach
std::vector
notify
update
detach
为解决上述问题,需引入同步机制。常用方法是使用互斥锁(
std::mutex
改进后的
Subject
class ThreadSafeSubject {
private:
mutable std::mutex mtx;
std::vector<Observer*> observers;
<p>public:
void attach(Observer* o) {
std::lock_guard<std::mutex> lock(mtx);
observers.push_back(o);
}</p><pre class='brush:php;toolbar:false;'>void detach(Observer* o) {
std::lock_guard<std::mutex> lock(mtx);
observers.erase(
std::remove(observers.begin(), observers.end(), o),
observers.end());
}
void notify() {
std::lock_guard<std::mutex> lock(mtx);
// 复制观察者列表以避免持有锁时调用回调
auto observers_copy = observers;
lock.unlock(); // 尽早释放锁
for (auto obs : observers_copy) {
obs->update();
}
}};
关键点说明:
std::lock_guard
notify
update
update
在高并发场景下,可考虑以下改进:
std::shared_ptr<Observer>
std::weak_ptr
shared_ptr
std::shared_mutex
notify
attach
detach
基本上就这些。线程安全的观察者模式核心在于保护共享状态,并谨慎处理回调时机。合理使用锁和智能指针,能有效避免竞态条件和内存问题。
以上就是C++观察者模式与线程安全结合使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号