深入了解C++11中promise和future
什么是promise和future
在C++11标准中,promise
和future
是一对用于线程间通信的重要工具。其中,promise
负责提供使用者一个方式去异步生成一个值;future
则提供了一种方式去访问这个值,或者等待这个值的生成。
可以将promise
看作是一个值得承诺,而future
则是对这个承诺的期望,而shared_future
则是对这个承诺的同时使用。
如何使用
以下是一个简单的使用案例:
#include <iostream>
#include <thread>
#include <future>
#include <chrono>
using namespace std;
void worker(promise<int> promise_obj) {
cout << "Worker is working..." << endl;
promise_obj.set_value(42);
}
int main() {
promise<int> promise_obj;
future<int> future_obj = promise_obj.get_future();
thread t(worker, move(promise_obj));
t.join();
cout << "Result: " << future_obj.get() << endl;
return 0;
}
在这个案例中,worker
函数在新的线程内部执行。我们通过promise_obj
对象提供了给这个任务一个承诺:在处理后使用set_value
方法设置一个值。在主线程中,我们通过promise_obj
对象获取了一个future_obj
对象,使用future_obj.get()
等待这个承诺的结果。
更多例子
这里介绍另一个简单的例子,实现两个同时开始的线程交换信息的功能:
#include <iostream>
#include <thread>
#include <future>
#include <chrono>
using namespace std;
void worker1(promise<string> promise_obj) {
string data = "Hello from worker1";
cout << "Worker1 is working..." << endl;
this_thread::sleep_for(chrono::seconds(1));
promise_obj.set_value(data);
}
void worker2(promise<string> promise_obj, future<string> future_obj) {
cout << "Worker2 is waiting..." << endl;
auto result = future_obj.get();
string data = "Hello back from worker2: " + result;
cout << "Worker2 is working..." << endl;
this_thread::sleep_for(chrono::seconds(1));
promise_obj.set_value(data);
}
int main() {
promise<string> promise1;
promise<string> promise2;
future<string> future1 = promise1.get_future();
future<string> future2 = promise2.get_future();
thread t1(worker1, move(promise1));
thread t2(worker2, move(promise2), move(future1));
t1.join();
t2.join();
cout << "Result: " << future2.get() << endl;
return 0;
}
在这个例子中,我们有两个线程:worker1
和worker2
。在worker1
中,我们创建了一个字符串,并将其设置为promise1
的值。在worker2
中,我们需要等待promise1
的结果出现后,在此基础上创建一个新的字符串,并将其作为promose2
的值。
值得注意的是,要调用std::move(promise1)
和std::move(future1)
是为了确保线程内的完整性,即保证这些对象不会被拷贝。最后,我们再通过future2.get()
进行等待,以得到最终的结果。
总结
通过promise
和future
的使用,我们可以很容易地在不同线程中交换状态和数据。因此,promise
和future
是用于在线程同步和通信方面的有用的工具。
但是,需要注意的是如果在使用promise
和future
时,必须始终确保线程的安全。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解C++11中promise和future的使用 - Python技术站