std::shared_future
和 std::promise
是 C++11 标准库中引入的两个类,它们用于异步编程和并发编程,特别是在多线程环境中。
std::promise
是一个可以在某个线程中存储一个值或异常的对象,以便稍后在另一个线程中通过 std::future
对象进行检索。std::promise
和 std::future
通常一起使用,以实现线程间的同步和数据传递。
优势:
std::promise
和 std::future
的操作是线程安全的。类型:
std::promise<T>
:可以存储类型为 T 的值或异常。应用场景:
std::shared_future
是 std::future
的一个共享版本。与 std::future
不同,多个 std::shared_future
对象可以共享同一个异步操作的结果。当一个 std::shared_future
对象被销毁时,只要还有其他的 std::shared_future
对象引用同一个异步操作的结果,那么该结果仍然有效。
优势:
std::future
对象被销毁,只要还有 std::shared_future
对象引用结果,结果就不会被销毁。类型:
std::shared_future<T>
:可以共享类型为 T 的值或异常。应用场景:
问题:为什么在使用 std::promise
和 std::future
时,有时候会出现数据竞争(data race)?
原因:
解决方法:
std::promise
和 std::future
时,遵循线程安全的编程实践。std::mutex
)或其他同步原语来保护共享数据。std::promise
或 std::future
对象的状态。示例代码:
#include <iostream>
#include <thread>
#include <future>
void compute(std::promise<int> prom) {
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟耗时操作
prom.set_value(42); // 设置值
}
int main() {
std::promise<int> prom;
std::future<int> fut = prom.get_future();
std::thread t(compute, std::move(prom));
std::cout << "Waiting for result...\n";
std::cout << "Result: " << fut.get() << '\n'; // 获取值
t.join();
return 0;
}
参考链接:
请注意,上述示例代码仅用于演示 std::promise
和 std::future
的基本用法,并未涉及 std::shared_future
。在实际应用中,你可以根据需要使用 std::shared_future
来共享异步操作的结果。
领取专属 10元无门槛券
手把手带您无忧上云