gpt4 book ai didi

没有超时的 C++ 条件变量

转载 作者:行者123 更新时间:2023-12-01 14:23:06 25 4
gpt4 key购买 nike

最近遇到一个C++中条件变量的问题。代码如下所示:

#include <iostream>   
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>

std::condition_variable cv;
std::mutex mutex;

int main(){

std::unique_lock<std::mutex> uniqueLock(mutex);

while (true)
{

if(cv.wait_for(uniqueLock, std::chrono::milliseconds(1000)) == std::cv_status::no_timeout)
{
std::cout << "has image" << std::endl;

}
else
{
std::cout<< "time out " << std::endl;
}

}

return 0;
}

这段代码的目的是:每次在另一个线程(cv.notify())中通知条件变量时,在控制台显示“有图像”,如果超过1000毫秒不能通知,则显示“暂停”。

所以上面代码的理论输出是(因为没有通知条件变量):
time out
time out
time out
time out

但是当我在Vs2015中执行这段代码时,发现输出很奇怪:
has image
time out
has image
time out
time out
time out
has image
has image
time out
time out
time out
time out
time out
has image
has image

我想知道为什么我有这个输出以及如何实现我的目标

谢谢 !

最佳答案

我不知道您的错误的原因是什么(但评论中有一些合理的解释)。但是,解决问题的一种方法是使用其他重载 wait_for ,其中包括一个谓词。

它可能看起来像这样(hasImage 在这里只是一个 bool 值,将其替换为对您的需求有意义的东西 - !imageStorage.empty() 或类似的):

while (true)
{

if (cv.wait_for(uniqueLock, std::chrono::milliseconds(1000), []() {return hasImage;}))
{
std::cout << "has image" << std::endl;
hasImage = false;
}
else
{
std::cout << "time out " << std::endl;
}

}

相关的一点是谓词检查是否确实有新图像,如果没有,则它应该继续等待。

此方法的一个限制是,如果谓词返回 false(无图像),那么您不知道条件变量是否因虚假唤醒、超时而唤醒,或者是否确实有图像但另一个线程刚刚占用在这人醒来之前它就消失了。但是,如果这是您的设计可以处理的事情,那么这种变化非常有效。

关于没有超时的 C++ 条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60278016/

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