在多线程C++中,拆除观察者关系通常涉及到以下几个步骤:
以下是一个简单的示例代码,演示如何在多线程C++中拆除观察者关系:
#include<iostream>
#include<vector>
#include <mutex>
#include<thread>
class Observer {
public:
virtual void update() = 0;
};
class Subject {
public:
void attach(Observer* observer) {
std::lock_guard<std::mutex> lock(m_mutex);
m_observers.push_back(observer);
}
void detach(Observer* observer) {
std::lock_guard<std::mutex> lock(m_mutex);
for (auto it = m_observers.begin(); it != m_observers.end(); ++it) {
if (*it == observer) {
m_observers.erase(it);
break;
}
}
}
void notify() {
std::lock_guard<std::mutex> lock(m_mutex);
for (auto observer : m_observers) {
observer->update();
}
}
private:
std::vector<Observer*> m_observers;
std::mutex m_mutex;
};
class MyObserver : public Observer {
public:
void update() override {
std::cout << "MyObserver::update() called."<< std::endl;
}
};
int main() {
Subject subject;
MyObserver observer;
subject.attach(&observer);
subject.notify();
subject.detach(&observer);
subject.notify();
return 0;
}
在这个示例中,我们定义了一个Observer
抽象类和一个Subject
类。Subject
类维护了一个观察者列表,并提供了attach()
、detach()
和notify()
方法来添加、删除和通知观察者。我们使用了互斥锁来确保在同一时间只有一个线程访问观察者列表。
在main()
函数中,我们创建了一个Subject
对象和一个MyObserver
对象,并将MyObserver
对象添加到Subject
对象的观察者列表中。然后,我们调用notify()
方法通知观察者,此时MyObserver
对象的update()
方法会被调用。接着,我们将MyObserver
对象从观察者列表中移除,再次调用notify()
方法通知观察者,此时MyObserver
对象的update()
方法不会被调用。
这个示例演示了如何在多线程C++中拆除观察者关系。在实际应用中,您可能需要根据具体情况进行更多的优化和错误处理。
领取专属 10元无门槛券
手把手带您无忧上云