Вы можете «сбросить» обещание, назначив его пустому обещанию.
myPromise = promise< int >();
Более полный пример:
promise< int > myPromise;
void writer()
{
for( int i = 0; i < 10; ++i )
{
cout << "Setting promise.\n";
myPromise.set_value( i );
myPromise = promise< int >{}; // Reset the promise.
cout << "Waiting to set again...\n";
this_thread::sleep_for( chrono::seconds( 1 ));
}
}
void reader()
{
int result;
do
{
auto myFuture = myPromise.get_future();
cout << "Waiting to receive result...\n";
result = myFuture.get();
cout << "Received " << result << ".\n";
} while( result < 9 );
}
int main()
{
std::thread write( writer );
std::thread read( reader );
write.join();
read.join();
return 0;
}
Однако проблема с этим подходом заключается вэта синхронизация между двумя потоками может заставить писателя вызывать promise::set_value()
более одного раза между вызовами читателя на future::get()
или future::get()
для вызова во время сброса обещания.Этих проблем можно избежать с осторожностью (например, при правильном сне между вызовами), но это приводит нас к царству взлома и догадок, а не к логически правильному параллелизму.
Таким образом, хотя можно сбросить обещание, назначив егок новому обещанию, это приводит к более широким проблемам синхронизации.