C++一个子线程不断更新变量,main函数中如何通过函数指针注册回调函数,获取子线程中当前的变量的?
时间: 2024-09-12 14:10:27 浏览: 54
在C++中,如果你有一个子线程不断更新某个全局或静态变量,并希望在主线程中通过函数指针接收这个变量的变化并执行相应的回调操作,可以采用条件变量(condition_variable)、互斥锁(mutex)以及共享内存(shared_ptr)等机制来实现。
首先,你需要创建一个共享数据容器,比如`std::atomic<T>`或者`std::shared_ptr<T>`,用于存储需要更新的值。然后,在子线程中修改这个变量,同时使用一个条件变量来通知主线程变化:
```cpp
#include <thread>
#include <atomic>
#include <condition_variable>
#include <functional>
// 共享变量
std::atomic<int> shared_var{0};
std::condition_variable cv;
bool done = false;
void update_thread() {
// 更新变量...
shared_var++;
// 当更新完成,通知主线程
cv.notify_all();
}
void on_update(int value) {
// 这是你想要的回调函数,它会在主线下游运行
std::cout << "Variable updated to: " << value << std::endl;
}
int main() {
std::thread worker(update_thread);
// 注册回调函数
auto callback = std::bind(on_update, shared_var.load()); // 获取当前值
std::unique_lock<std::mutex> lock(cv_mutex); // 加锁
while (!done) { // 循环等待直到子线程结束
cv.wait(lock, [] { return shared_var != 0 || done; }); // 等待条件满足
}
// 主线程关闭条件变量
done = true;
cv.notify_one(); // 唤醒主线程
worker.join(); // 等待子线程结束
return 0;
}
```
每次`update_thread()`更新完变量后会唤醒主线程,这时你可以从`shared_var.load()`获取到最新的值并调用注册的回调函数。
阅读全文
相关推荐


















