C++一个子线程不断更新变量,main函数中如何通过注册回调函数和回调函数,获取子线程中当前的变量的
时间: 2024-09-12 14:10:24 浏览: 50
在C++中,如果你想让一个子线程持续更新一个变量,然后在主线程中通过回调函数获取这个变量的新值,可以使用`std::condition_variable`配合`std::thread`来实现。这里有一个基本的例子:
```cpp
#include <thread>
#include <mutex>
#include <condition_variable>
class VariableProvider {
public:
int value = 0; // 变量
mutable std::mutex mtx; // 保护变量
std::condition_variable cv; // 用于同步线程
// 更新变量的函数
void updateValue(int new_value) {
std::unique_lock<std::mutex> lock(mtx);
value = new_value;
cv.notify_one(); // 触发等待的线程
}
// 回调函数,主线程注册并等待变量变化
void registerCallback(std::function<void(const int&)> callback) {
std::thread(callback_thread, [this, &callback]() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return value != 0; }); // 等待直到有新值
if (value != 0) {
callback(value); // 调用回调函数
}
}
});
}
};
int main() {
VariableProvider provider;
provider.registerCallback([](const int& value) { // 注册回调函数
std::cout << "New value is: " << value << '\n';
});
// 启动子线程更新变量
std::thread update_thread([&provider](){
for (int i = 0; ; ++i) {
provider.updateValue(i); // 每次循环更新变量
}
});
update_thread.join(); // 确保子线程结束再退出main
return 0;
}
```
在这个示例中,`VariableProvider`类包含一个`updateValue`方法,它在线程安全的方式下更新变量,并唤醒等待在条件变量上的线程。`registerCallback`方法启动一个新的线程,该线程不断地从条件变量上获取新的变量值,并调用用户提供的回调函数。
阅读全文
相关推荐


















