C++ 开启子线程进行异步操作,主线程不阻塞,子线程运行结束后获取结果发送到主线程显示
时间: 2024-09-27 17:03:20 浏览: 60
在C++中,你可以使用`std::thread`库来创建子线程进行异步操作。为了实现主线程不阻塞并等待子线程完成后再获取结果,可以借助条件变量`std::condition_variable`或者`std::future`。
下面是一个简单的示例:
```cpp
#include <iostream>
#include <thread>
#include <mutex> // For std::mutex and std::lock_guard
#include <condition_variable> // For std::condition_variable
// 这里假设我们有一个函数runTask()将在子线程中执行,并返回结果
int runTask(int input) {
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作
return input * 2;
}
void workerThread(int input, std::condition_variable& cv, std::mutex& mtx) {
int result = runTask(input);
{
std::unique_lock<std::mutex> lock(mtx);
cv.notify_one(); // 主线程可以继续了
}
std::cout << "Worker thread finished, result is: " << result << std::endl;
}
int main() {
std::mutex mtx; // 用于同步主线程和子线程
std::condition_variable cv; // 创建条件变量
int input = 5;
// 创建子线程
std::thread worker(workerThread, input, cv, mtx);
// 在这里,主线程不阻塞,而是等待cv被唤醒
cv.wait(lock_guard<std::mutex>(mtx), []{return worker.joinable();});
// 等待子线程结束,并获取结果
worker.join();
// 显示子线程的结果
std::cout << "Result from the worker thread: " << input << "\n";
return 0;
}
```
在这个例子中,`workerThread`在子线程中执行,主线程通过`cv.wait`阻塞直到子线程结束并唤醒。子线程完成后,将结果放入全局可访问的数据结构(在这里省略),然后主线程再获取并显示结果。
阅读全文