C++11的future
和promise
,以及packaged_task
的使用是实现多线程和异步操作的重要方式之一。接下来我将详细讲解这三种机制的用法和特点。
std::future
std::future
是C++11提供的一个用于异步操作的机制,它允许我们在一个线程中启动一个异步操作,在另一个线程中等待该操作完成,并从操作中获取结果。
下面是一个简单的例子:
#include <iostream>
#include <thread>
#include <future>
int foo() {
std::this_thread::sleep_for(std::chrono::seconds(5));
return 42;
}
int main() {
std::future<int> result = std::async(std::launch::async, foo);
std::cout << "Waiting..." << std::endl;
int value = result.get();
std::cout << "Result is " << value << std::endl;
return 0;
}
在这个例子中,我们定义了foo'函数,它会休眠5秒钟,然后返回整数
42。在
main'函数中,我们启动一个异步操作,使用std::async
函数并传入foo
函数的指针作为参数。该函数返回std::future'对象,代表异步操作的结果。接着我们调用
result.get()等待异步操作完成,并从该
std::future`对象中获取结果。最后,我们输出该结果并退出程序。
std::promise
std::promise
是用于异步操作的另一个机制,它允许我们在一个线程中设置结果,并在另一个线程中获取这个结果。下面是一个例子:
#include <iostream>
#include <thread>
#include <future>
void foo(std::promise<int>& promise) {
std::this_thread::sleep_for(std::chrono::seconds(5));
promise.set_value(42);
}
int main() {
std::promise<int> promise;
std::future<int> result = promise.get_future();
std::thread thread(foo, std::ref(promise));
std::cout << "Waiting..." << std::endl;
int value = result.get();
std::cout << "Result is " << value << std::endl;
thread.join();
return 0;
}
在这个例子中,我们定义了foo'函数,并传入一个
std::promise对象的引用。该函数会休眠5秒钟,然后调用`promise.set_value`函数设置结果。在`main`函数中,我们创建了一个`std::promise'对象和一个与之关联的`std::future'对象。接着,我们创建了一个新线程,将`foo'函数和`promise
对象的引用作为参数传入,并在线程中执行该函数。最后,我们调用result.get()
等待异步操作完成,并从该std::future
对象中获取结果。
std::packaged_task
std::packaged_task
是一种允许我们将一个函数或可调用对象封装为一个异步操作的机制。使用std::packaged_task
可以使函数的返回值可以被std::future
对象获取到。
下面是一个例子:
#include <iostream>
#include <thread>
#include <future>
void foo(int a, int b, std::promise<int>& promise) {
promise.set_value(a + b);
}
int main() {
std::packaged_task<void(int, int, std::promise<int>&)> task(foo);
std::promise<int> promise;
std::future<int> result = promise.get_future();
task(1, 2, std::ref(promise));
std::cout << "Waiting..." << std::endl;
int value = result.get();
std::cout << "Result is " << value << std::endl;
return 0;
}
在这个例子中,我们定义了foo'函数,并传入两个参数和一个
std::promise'对象的引用。该函数会将两个参数相加,并调用promise``对象的
set_value'函数设置结果。在main'函数中,我们创建了一个
std::packaged_task'对象,使用foo'函数指针初始化它,并传入了三个参数。接着,我们创建了一个
std::promise'对象和一个与之关联的std::future'对象。我们调用
task对象并传入三个参数,即使得
foo'函数在另一个线程中异步执行。最后,我们调用result.get()
等待异步操作完成,并从该std::future
对象中获取结果。
以上就是关于C++11
的future'、
promise'、`package_task'的使用方法和示例,希望你对这三种机制有了更加深刻的理解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11的future和promise、parkged_task使用 - Python技术站