需求:全局變量發生變化時,自動觸發類方法調用。本質是觀察者模式在全局狀態上的應用。
| 方案 | 實現複雜度 | 實時性 | 資源消耗 | 線程安全 | 推薦度 |
|---|---|---|---|---|---|
| 多線程輪詢 | 低 | 延遲 = 輪詢間隔 | 持續佔用 CPU | 需鎖保護 | ⭐ |
| 封裝 Setter + 回調 | 低 | 即時 | 極低 | 需鎖/原子操作 | ⭐⭐⭐⭐ |
| 觀察者模式 | 中 | 即時 | 低 | 線程安全容器 | ⭐⭐⭐⭐⭐ |
| 信號量/條件變量 | 中 | 即時 | 低(阻塞等待) | 系統級同步 | ⭐⭐⭐ |
| 屬性監聽框架 | 高 | 即時 | 框架開銷 | 框架保證 | ⭐⭐⭐ |
class GlobalConfig {
int value;
std::mutex mtx;
std::vector> callbacks;
public:
int get() {
std::lock_guard lock(mtx);
return value;
}
void set(int newVal) {
std::lock_guard lock(mtx);
if (value != newVal) {
value = newVal;
// 複製回調列表,避免回調中修改容器導致死鎖
auto cbs = callbacks;
}
for (auto &cb : cbs) cb(value);
}
void registerCallback(std::function cb) {
std::lock_guard lock(mtx);
callbacks.push_back(cb);
}
};
// 全局實例
GlobalConfig g_config;
// 使用者類
class MyClass {
public:
MyClass() {
g_config.registerCallback([this](int v) { onConfigChanged(v); });
}
void onConfigChanged(int v) { /* 處理變化 */ }
};
// 抽象主題
class Subject {
std::vector observers;
std::mutex mtx;
public:
void attach(Observer* o) {
std::lock_guard lock(mtx);
observers.push_back(o);
}
void detach(Observer* o) { ... }
void notify(int value) {
std::lock_guard lock(mtx);
for (auto o : observers) o->update(value);
}
};
// 具體主題:全局配置
class GlobalConfig : public Subject {
int value;
public:
void setValue(int v) {
if (value != v) {
value = v;
notify(value);
}
}
int getValue() const { return value; }
};
// 觀察者接口
class Observer {
public:
virtual void update(int value) = 0;
virtual ~Observer() = default;
};
// 具體觀察者
class MyClass : public Observer {
public:
void update(int value) override {
std::cout << "Config changed to " << value << std::endl;
}
};
std::atomic g_value{0};
std::condition_variable g_cv;
std::mutex g_cv_mtx;
void watcherThread() {
int last = g_value.load();
while (running) {
std::unique_lock lock(g_cv_mtx);
// 等待變化或超時
g_cv.wait_for(lock, 100ms, [&]{ return g_value.load() != last; });
int current = g_value.load();
if (current != last) {
last = current;
onValueChanged(current); // 在鎖外調用
}
}
}
void setter(int newVal) {
g_value.store(newVal);
g_cv.notify_one(); // 喚醒等待線程
}
std::atomic 或 mutex 保護detach,否則野指針崩潰if (old != new))attach/detach 導致迭代器失效全局變量監控不推薦多線程輪詢(資源浪費、延遲不可控)。首選封裝 Setter + 回調,簡單高效;複雜場景用觀察者模式,解耦合擴展性強;高性能無鎖用 atomic + condition_variable。核心原則:封裝變量、顯式變更通知、線程安全、生命週期管理。將全局變量升級為「可觀察對象」,是從 C 風格邁向 C++ 現代設計的關鍵一步。