如何解决使用Promise and Future提供从一个线程到另一个线程的连续定期通知
我有两个线程。一个线程充当计时器线程,需要在固定的时间间隔内将通知发送到另一个线程。我打算为此使用C ++ Promise and Future而不是C ++条件变量。
我有以下限制/条件:-
- 要避免锁定互斥锁(因此决定不使用C ++
std::condition_variable
,因此必须使用互斥锁) - 如果计时器(或通知)线程尚未准备就绪(即仍在处理最后一个通知),则无需向消费者发送通知
我决定使用C ++ Promise and Future并提出了这段代码。
// promiseFutureAtomic.cpp
#include <atomic>
#include <condition_variable>
#include <iostream>
#include <thread>
#include <iostream> // std::cout,std::endl
#include <thread> // std::this_thread::sleep_for
#include <chrono> // std::chrono::seconds
#include <future>
std::promise<void> aPromisingFuture;
std::atomic<bool> readyForNotification{false};
std::atomic<bool> stop_consumer{false};
void waitingForWork(){
while (!stop_consumer)
{
std::cout << "Waiting " << std::endl;
std::promise<void> newPromise;
aPromisingFuture = std::move(newPromise);
auto aFuture = aPromisingFuture.get_future();
readyForNotification = true;
aFuture.wait();
std::cout << "Running " << std::endl;
// Do useful work but no critical section.
}
}
void setDataReady(){
int i = 0;
while (i++ < 10)
{
std::this_thread::sleep_for (std::chrono::seconds(1));
if (readyForNotification)
{
readyForNotification = false;
std::cout << "Data prepared" << std::endl;
aPromisingFuture.set_value();
}
}
stop_consumer = true;
}
int main(){
std::cout << std::endl;
std::thread t1(waitingForWork);
std::thread t2(setDataReady);
t1.join();
t2.join();
std::cout << std::endl;
}
我的问题是:-
- 与即将发布的C ++ 20
std::atomic_wait
/std::atomic_notify
相比,这种方法的性能如何? -
std::future<T>::wait()
是否遭受虚假唤醒(例如C ++std::condition_variable::wait
)? - 与使用
std::condition_variable::wait
的常规方法相比,此方法是否有任何缺点?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。