gpt4 book ai didi

c++ - 如何反转 set_value() 和 'deactivate' promise ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:17 24 4
gpt4 key购买 nike

我在这里有一个关于同步的问题。我有一个“编写器”线程,它在每次迭代时为 promise 分配不同的值“p”。我需要等待此值的 shared_futures 然后处理它们的“阅读器”线程,我的问题是如何使用 future / promise 来确保阅读器线程在执行其处理任务之前等待“p”的新更新每次迭代?非常感谢。

最佳答案

您可以通过将 promise 分配给空白 promise 来“重置” promise 。

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;
}

但是,这种方法的一个问题是,两个线程之间的同步会导致编写器在读取器调用 future 之间多次调用 promise::set_value(): :get()future::get() 在重置 promise 时调用。这些问题可以小心避免(例如,在调用之间适当休眠),但这会将我们带入黑客和猜测的领域,而不是逻辑上正确的并发。

因此,尽管可以通过将 promise 分配给新的 promise 来重置 promise ,但这样做往往会引发更广泛的同步问题。

关于c++ - 如何反转 set_value() 和 'deactivate' promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6541369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com