我尝试使用std::promise
在单独的线程上向函数发送信号
class MyClass {
std::promise<void> exitSignal;
std::thread monitorThread;
}
void MyClass::start() {
exitSignal = std::promise<void>();
std::future<void> futureObj = exitSignal.get_future();
monitorThread = std::thread(&MyClass::monitorFunction, this, std::move(futureObj));
}
void MyClass::stop() {
exitSignal.set_value();
if (monitorThread.joinable()) {
monitorThread.join();
}
}
void MyClass::monitorFunction(std::future<void> futureObj) {
while (futureObj.wait_for(std::chrono::seconds(1)) == std::future_status::timeout) {
// do stuff
}
}
它运行良好,直到我尝试第二次调用start。然后我得到一个错误
std::future_error: Promise already satisfied
为什么呢?我每次开始都刷新承诺,未来似乎是有效的...
1条答案
按热度按时间wqnecbli1#
我将回应@Homer512的评论,并建议您调用
stop()
两次。我用您的代码做了一个小测试:当我按原样运行时(第二个
stop
被注解掉),它运行时没有任何问题:但如果放入第二个
stop
,则会遇到异常: