21xrx.com
2024-12-22 21:44:56 Sunday
登录
文章检索 我的文章 写文章
使用C++的Future和Promise机制进行异步编程
2023-07-02 12:51:55 深夜i     --     --
C++ Future Promise 异步编程 机制

异步编程是现代开发中不可避免的需求,特别是在大规模、复杂的应用程序中,需要进行大量的并发和I/O操作。C++11引入了一种可重复使用的机制,Future和Promise机制,使异步编程变得更加容易。在本文中,我们将介绍如何使用C++的Future和Promise机制进行异步编程。

1. Future和Promise是什么?

首先,我们需要了解Future和Promise是什么。相对于多线程和回调的解决方案,Future和Promise机制提供了更高层次的抽象,使得异步编程更容易实现和维护。Future表示一个类型T的未来值,Promise表示一个类型T的未来值的承诺,当没有值可用时,将值传递给Future。Future和Promise的配对使得异步编程更加简单,因为程序员只需要关心在Promise上设置值,并且在Future上等待时,并发和I/O操作的所有细节都将自动处理。

2. 如何使用Future和Promise?

首先,我们需要使用Promise在一个线程中创建一个Future。Promise允许程序员在一条语句中创建一个Future并设置Future的值。然后,Future可以被传递到其他线程中,以异步地获取值。下面是使用Future和Promise的简单示例:


#include <future>

#include <iostream>

#include <thread>

void async_function(std::promise<int>& promise) {

 std::this_thread::sleep_for(std::chrono::seconds(1));

 promise.set_value(42);

}

int main() {

 std::promise<int> promise;

 std::future<int> future = promise.get_future();

 std::thread thread(async_function, std::ref(promise));

 std::cout << "Waiting..." << std::endl;

 int value = future.get();

 std::cout << "Got value: " << value << std::endl;

 thread.join();

 return 0;

}

在这个例子中,我们创建了一个Promise,并从它中获取了一个Future。我们将Promise传递给一个线程参数,并在异步函数中设置了它的值。最后,我们使用Future等待并获取该值。

3. Promise可以在任何时间点设置值

如果Promise在Future被获取之前设置了一个值,那么Future将立即返回该值,并且将不会阻塞。如果Promise在Future返回时还没有设置值,那么Future将被阻塞,直到值可用。


std::future<int> future = promise.get_future();

promise.set_value(42); // 值将会立即返回

int value = future.get(); // value = 42


std::future<int> future = promise.get_future();

int value = future.get(); // 程序将被阻塞,直到promise.set_value被调用

promise.set_value(42);

在下面的例子中,我们在一个循环中使用Future和Promise来执行异步并发操作。


#include <future>

#include <iostream>

#include <vector>

void async_function(int i, std::promise<int>& promise) {

 std::this_thread::sleep_for(std::chrono::seconds(1));

 promise.set_value(i);

}

int main() {

 std::cout << "Starting..." << std::endl;

 std::vector<std::future<int>> futures;

 std::vector<std::thread> threads;

 for (int i = 0; i < 10; i++) {

  std::promise<int> promise;

  futures.push_back(promise.get_future());

  threads.push_back(std::thread(async_function, i, std::ref(promise)));

 }

 for (int i = 0; i < 10; i++) {

  std::cout << "Got value: " << futures[i].get() << std::endl;

  threads[i].join();

 }

 return 0;

}

在这个例子中,我们在一个循环中创建Future和Promise,并使用它们来执行十个异步函数。然后,我们使用Future获取异步操作的返回值,并使用join()函数等待所有线程完成。

4. 结论

使用C++的Future和Promise机制进行异步编程可以使程序员更专注于实现业务逻辑,而不是处理并发和I/O操作的细节。Future和Promise机制使得异步编程更加容易实现和维护,这对大规模应用程序开发来说尤为重要。因此,使用Future和Promise机制成为现代C++异步编程的重要组成部分。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复