Std::promise 是一个类
std::future也是一个类
std::future<bool>futObj 表示一个保存bool值的future类对象。
std::promise<bool> proObj表示promise的一个类对象叫proObj,该对象保存了一个类型为bool的值,该值可被future对象读取(可能在另外一个线程中),因此 promise也提供了一种线程同步的手段。在 promise 对象构造时可以和一个共享状态(通常是std::future)相关联:futObj = proObj.get_futrue()。
std::promise::set_value
Atomically stores the value into the shared state and makes the state ready
作用:原子性地将值存储到共享状态并使状态就绪,有点线程之间信号量的意思,见如下链接:
https://en.cppreference.com/w/cpp/thread/promise/set_value
Example
This example shows how promise<void> can be used as signals between threads.
#include <thread>
#include <future>
#include <cctype>
#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <sstream>
int main()
{
std::istringstream iss_numbers{"3 4 1 42 23 -23 93 2 -289 93"};
std::istringstream iss_letters{" a 23 b,e a2 k k?a;si,ksa c"};
std::vector<int> numbers;
std::vector<char> letters;
std::promise<void> numbers_promise, letters_promise;
auto numbers_ready = numbers_promise.get_future();
auto letter_ready = letters_promise.get_future();
std::thread value_reader([&]
{
// I/O operations.
std::copy(std::istream_iterator<int>{iss_numbers},
std::istream_iterator<int>{},
std::back_inserter(numbers));
//Notify for numbers.
numbers_promise.set_value();
std::copy_if(std::istreambuf_iterator<char>{iss_letters},
std::istreambuf_iterator<char>{},
std::back_inserter(letters),
::isalpha);
//Notify for letters.
letters_promise.set_value();
});
numbers_ready.wait();
std::sort(numbers.begin(), numbers.end());
if (letter_ready.wait_for(std::chrono::seconds(1)) ==
std::future_status::timeout)
{
//output the numbers while letters are being obtained.
for (int num : numbers) std::cout << num << ' ';
numbers.clear(); //Numbers were already printed.
}
letter_ready.wait();
std::sort(letters.begin(), letters.end());
//If numbers were already printed, it does nothing.
std::cout <<"num : ";
for (int num : numbers) std::cout <<num << ' ';
std::cout << '\n';
std::cout <<"let: " ;
for (char let : letters) std::cout <<let << ' ';
std::cout << '\n';
value_reader.join();
}
运行结果: