C++子线程执行的函数参数,如何在子线程外注册回调函数查看子线程内参数的变化
时间: 2024-09-12 19:09:40 浏览: 53
MFC子线程中更新控件内容的两种办法
5星 · 资源好评率100%
在C++中,子线程通常不会直接将内部变量暴露给主线程,因为它们运行在独立的数据上下文中。如果你想要在子线程执行过程中修改的数据能够在线程结束后通知到主线程,你可以使用共享内存(如`boost::interprocess`或`std::mutex`、`std::condition_variable`等)以及回调函数。
一种常见的做法是在子线程开始前创建一个数据结构(例如`std::pair<int, std::function<void(int)>>`),其中包含你要观察的值和一个回调函数。然后,每当子线程内的值发生变化时,它可以直接更新这个值,并调用回调函数。
这里是使用`std::async`创建子线程并传递回调函数的一个示例:
```cpp
#include <future>
#include <iostream>
// 回调函数模板
template<typename T>
void update_and_notify(T value, std::function<void(T)> callback) {
// 更新值
value++;
// 调用回调函数
callback(value);
}
int main() {
int shared_value = 0;
std::function<void(int)> notify_callback = [&](int val) {
std::cout << "Callback called with value: " << val << std::endl;
};
auto future = std::async(std::launch::async, update_and_notify, shared_value, notify_callback);
// 主线程在这里继续工作,子线程会异步执行
// 如果需要,你可以获取结果
if (future.wait_for(std::chrono::seconds(5)) == std::future_status::ready) {
std::cout << "Future result: " << future.get() << std::endl;
}
return 0;
}
```
在这个例子中,当你想要查看子线程中`shared_value`的变化时,`notify_callback`会被调用。注意,这种方式假设子线程不会无限期地阻塞,如果子线程执行时间过长,`wait_for`可能需要更复杂的错误处理。
阅读全文