首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++什么是std::shared_future和std::promise

std::shared_futurestd::promise 是 C++11 标准库中引入的两个类,它们用于异步编程和并发编程,特别是在多线程环境中。

std::promise

std::promise 是一个可以在某个线程中存储一个值或异常的对象,以便稍后在另一个线程中通过 std::future 对象进行检索。std::promisestd::future 通常一起使用,以实现线程间的同步和数据传递。

优势

  • 线程安全:std::promisestd::future 的操作是线程安全的。
  • 简化并发编程:它们提供了一种相对简单的方式来处理多线程间的数据传递和同步。

类型

  • std::promise<T>:可以存储类型为 T 的值或异常。

应用场景

  • 当你需要在一个线程中计算一个值,并将这个值传递给另一个线程时。
  • 当你需要在多个线程间同步状态或数据时。

std::shared_future

std::shared_futurestd::future 的一个共享版本。与 std::future 不同,多个 std::shared_future 对象可以共享同一个异步操作的结果。当一个 std::shared_future 对象被销毁时,只要还有其他的 std::shared_future 对象引用同一个异步操作的结果,那么该结果仍然有效。

优势

  • 共享结果:允许多个对象共享同一个异步操作的结果。
  • 延长结果生命周期:即使原始的 std::future 对象被销毁,只要还有 std::shared_future 对象引用结果,结果就不会被销毁。

类型

  • std::shared_future<T>:可以共享类型为 T 的值或异常。

应用场景

  • 当你需要在多个线程间共享异步操作的结果时。
  • 当你需要延长异步操作结果的生命周期时。

常见问题及解决方法

问题:为什么在使用 std::promisestd::future 时,有时候会出现数据竞争(data race)?

原因

  • 数据竞争通常发生在多个线程同时访问和修改共享数据时,而没有适当的同步机制。

解决方法

  • 确保在使用 std::promisestd::future 时,遵循线程安全的编程实践。
  • 使用互斥锁(如 std::mutex)或其他同步原语来保护共享数据。
  • 避免在多个线程中同时修改 std::promisestd::future 对象的状态。

示例代码

代码语言:txt
复制
#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::promisestd::future 的基本用法,并未涉及 std::shared_future。在实际应用中,你可以根据需要使用 std::shared_future 来共享异步操作的结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券