C++11中的
std::promise的基本用法
std::promise的基本用法非常简单。我们可以先创建一个std::promise对象,然后再传递它的.future()给另一个线程使用。在另一个线程中,我们可以通过调用该future中的.get()方法来获取std::promise中存储的值。
#include <iostream>
#include <thread>
#include <future>
void task(std::promise<int> p)
{
// do some work
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
// set the value in the promise
p.set_value(42);
}
int main()
{
// create a promise and a future
std::promise<int> p;
std::future<int> f = p.get_future();
// start a new thread and pass the promise as argument
std::thread t(task, std::move(p));
// get the value from the future
int result = f.get();
std::cout << "The result is " << result << std::endl;
// join the thread
t.join();
return 0;
}
在上面的例子中,我们创建了一个std::promise对象,并把它的.future()赋值给了一个std::future对象。我们在另一个线程中执行了一个任务,并通过调用p.set_value(42)来设置std::promise中存储的值。主线程通过调用f.get()获取该值,并将其打印在屏幕上。
std::promise的异常处理
std::promise不仅可以存储数据,还可以抛出异常。我们可以通过调用promise对象的set_exception()方法来抛出异常。在另一个线程中,我们可以通过调用future对象的get()方法来捕获该异常。
#include <iostream>
#include <thread>
#include <future>
#include <exception>
#include <stdexcept>
void task(std::promise<int> p)
{
// do some work
try {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
throw std::runtime_error("throw an exception from worker thread.");
} catch(...) {
// set the exception in the promise
p.set_exception(std::current_exception());
}
}
int main()
{
// create a promise and a future
std::promise<int> p;
std::future<int> f = p.get_future();
// start a new thread and pass the promise as argument
std::thread t(task, std::move(p));
// get the value from the future
try {
int result = f.get();
std::cout << "The result is " << result << std::endl;
} catch (const std::exception& e) {
std::cout << "Exception caught: " << e.what() << std::endl;
}
// join the thread
t.join();
return 0;
}
在上面的例子中,我们在工作线程中抛出了一个std::runtime_error异常,并通过调用p.set_exception(std::current_exception())把异常传递给promise对象。主线程通过调用f.get()获取值,如果在获取时抛出了异常,我们可以通过捕捉std::exception并在控制台打印错误消息。
这就是std::promise的简介,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11