- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望下面的代码每次都能通过所有断言并成功完成。目前似乎 std::future.get()
每次都在两个分支中阻塞。尽管 wait_for()
显示状态为 ready
并且 wait()
立即返回,但它会永远阻塞。 gcc 7.4.0 和 clang 6.0.0 的结果相同。
#include <chrono>
#include <condition_variable>
#include <future>
#include <functional>
#include <iostream>
#include <mutex>
#include <queue>
#include <cassert>
#include <unistd.h>
template<class T>
class BlockingQueue {
std::queue<T> theQueue;
std::mutex mtx;
std::condition_variable hasDataCondition;
public:
void push(const T& t) {
std::unique_lock<std::mutex> lock{mtx};
theQueue.push(t);
hasDataCondition.notify_all();
}
T popWhenAvailable(int i = 0) {
std::unique_lock<std::mutex> lock{mtx};
if (theQueue.empty()) {
std::cout << "Waiting " << i << std::endl;
hasDataCondition.wait(lock, [this]{return not theQueue.empty();});
std::cout << "Done waiting " << i << std::endl;
}
T front = std::move(theQueue.front());
theQueue.pop();
std::cout << "Got value " << front << " and popped it on " << i << std::endl;
return front;
}
};
int main(int argc, char** argv) {
BlockingQueue<int> q;
auto futureInt0 = std::async(std::launch::async, [&]{return q.popWhenAvailable();});
auto futureInt1 = std::async(std::launch::async, [&]{return q.popWhenAvailable(1);});
std::cout << "Starting threads..." << std::endl;
sleep(2);
assert(futureInt0.wait_for(std::chrono::milliseconds(300)) != std::future_status::ready);
assert(futureInt1.wait_for(std::chrono::milliseconds(300)) != std::future_status::ready);
std::cout << "Pushing data..." << std::endl;
q.push(4);
std::cout << "Pushed! Checking results..." << std::endl;
if (futureInt0.wait_for(std::chrono::milliseconds(300)) == std::future_status::ready) {
std::cout << "Future 0 ready." << std::endl;
assert(futureInt1.wait_for(std::chrono::milliseconds(300)) != std::future_status::ready);
std::cout << "Future 1 isn't ready (it shouldn't be)." << std::endl;
std::cout << "Trying to wait() for future 0, should return immediately..." << std::endl;
futureInt0.wait();
std::cout << "Now get() the value..." << std::endl;
assert(futureInt0.get() == 4);
} else {
std::cout << "Future 0 not ready. Trying future 1..." << std::endl;
assert(futureInt1.wait_for(std::chrono::milliseconds(300)) == std::future_status::ready);
std::cout << "Future1 status is ready. Trying to wait(), should return immediately..." << std::endl;
futureInt1.wait();
std::cout << "Now get() the value..." << std::endl;
assert(futureInt1.get() == 4);
}
}
最佳答案
有趣!我发现的第一件事是,正如 @rafix07 所指出的那样,您正在等待第二个线程弹出一些东西。我不确定最终目标是什么,但这可行。我在 MSVC 上测试过,这里是 g++ on Coliru
#include <chrono>
#include <condition_variable>
#include <future>
#include <functional>
#include <iostream>
#include <mutex>
#include <queue>
#include <thread>
#include <cassert>
template<class T>
class BlockingQueue {
std::queue<T> theQueue;
std::mutex mtx;
std::condition_variable hasDataCondition;
public:
void push(const T& t) {
std::unique_lock<std::mutex> lock{ mtx };
theQueue.push(t);
hasDataCondition.notify_all();
}
T popWhenAvailable(int i) {
std::unique_lock<std::mutex> lock{ mtx };
std::cout << "popWhenAvailable: " << i << std::endl;
if (theQueue.empty()) {
std::cout << "Waiting " << i << std::endl;
hasDataCondition.wait(lock, [this] {return ! theQueue.empty(); });
std::cout << "Done waiting " << i << std::endl;
}
T front = std::move(theQueue.front());
theQueue.pop();
std::cout << "Got value " << front << " and popped it on " << i << std::endl;
return front;
}
};
int main(int argc, char** argv) {
using namespace std::chrono_literals;
BlockingQueue<int> q;
auto futureInt0 = std::async(std::launch::async, [&] {return q.popWhenAvailable(0); });
auto futureInt1 = std::async(std::launch::async, [&] {return q.popWhenAvailable(1); });
std::cout << "Starting threads...\n" << std::endl;
std::this_thread::sleep_for(1000ms);
assert(futureInt0.wait_for(std::chrono::milliseconds(300)) != std::future_status::ready);
assert(futureInt1.wait_for(std::chrono::milliseconds(300)) != std::future_status::ready);
std::cout << "Pushing data..." << std::endl;
q.push(4);
std::cout << "Pushed! Checking results..." << std::endl;
std::pair<bool, bool> done = { false,false };
for (;;) {
if (!done.first && futureInt0.wait_for(std::chrono::milliseconds(300)) == std::future_status::ready) {
std::cout << "Future 0 ready." << std::endl;
futureInt0.wait();
std::cout << "Now get() the value 0: " << futureInt0.get() << std::endl;
done.first = true;
}
else if(!done.second && futureInt1.wait_for(std::chrono::milliseconds(300)) == std::future_status::ready) {
std::cout << "Future 1 ready." << std::endl;
futureInt1.wait();
std::cout << "Now get() the value 1: " << futureInt1.get() << std::endl;
done.second = true;
}
if (done.first && done.second)
break;
else if(done.first || done.second)
q.push(8);
}
}
关于c++ - std::future get() 在 wait_for() 状态准备好且 wait() 返回时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66509383/
我想要一个线程 (std::thread) 每 60 秒完成一次工作,否则休眠并在外部请求时立即返回。std::jthread 不是一个选项,我仅限于 C++14。 std::condition_va
我正在通过 Terraform 配置一个新服务器,并使用 Ansible 作为本地系统上的配置程序。 Terraform 在 EC2 上配置一个系统,然后运行 Ansible playbook,提
我想要一个线程 (std::thread) 每 60 秒完成一次工作,否则休眠并在外部请求时立即返回。std::jthread 不是一个选项,我仅限于 C++14。 std::condition_va
在我的工作环境中,创建了虚拟机,并在创建登录访问信息后将其添加到虚拟机中,这可能会有延迟,所以仅仅等待我的 ansible 脚本检查 SSH 是否可用是不够的,我实际上需要检查是否ansible 可以
假设一个类似这样的命令: @bot.command() async def test(ctx): def check(r, u): return u == ctx.messag
使用 Python 3.6.8 async def sleeper(): time.sleep(2) async def asyncio_sleeper(): await asynci
我正在Visual Studio 2019上使用condition_variable。condition_variable.wait_for()函数将返回std::cv_status::no_time
如果我在文件上使用 search_regex='foo',则使用 Ansible 中的 wait_for 模块 它似乎从文件的开头开始,这意味着它将匹配旧数据,因此当重新启动附加到文件而不是启动新文件
我正在尝试利用队列模块的wait_for方法。我有一个谓词的可调用对象,如果我不传递任何参数,它就可以工作,但是可调用对象需要一个 int 参数。 作品: self.cv.wait_for(fn, t
文档说可以使用 Predicate 的第二次重载来避免虚假唤醒。我没有看到它,如何修改我的代码以确保 wait_for 不会被虚假唤醒? while(count_ > 0) { if (con
我试图测试一批连接,但所有错误响应失败的连接都是“超时”,但我知道(我测试过)其中一些是“没有主机路由”。我如何在 ansible 中使用 wait_for 来做到这一点? - name: Test
我在单元测试中有一些代码等待我的 vector 足够大: bool waitForOutwardMessages(size_t size, int millis) { std::unique_
我正在尝试使用 ansible 来配置我必须使用的环境。特别是,我需要编写一个重启服务器的任务,所以我写了这个任务: - name: waiting for server to come back
Spurious wakup各种平台都允许。为了解决这个问题,我们编写了以下循环机制: while(ContinueWaiting()) cv.wait(lock); // cv is a `
这是来自 http://www.cplusplus.com/reference/condition_variable/condition_variable/wait_for/ 的简单代码 为什么如果我
我无法理解为什么我认为应该通过的测试用例大部分时间都失败了。我已将测试提炼为条件变量并使用 wait_for 方法,具体测试它是否确实至少等待了指定的持续时间。 测试代码片段如下: TEST_CASE
我有C#编码经验;我开始学习 C++ 并使用 boost 库进行线程处理。我编写了以下类 - 试图将成员函数作为线程执行。编写以下简单代码,我希望线程函数内的 while 循环每秒执行一次。 #inc
我正在尝试制作多线程应用程序,其中每个线程都将在不同的时间处理任务。所以我想使用 future 和 future::wait_for 函数。但是当我只使用来自 CPP reference 的代码时 #
条件变量的典型用法如下所示(参见下面的代码):http://en.cppreference.com/w/cpp/thread/condition_variable . 但是,似乎主线程可能会在工作线程
下面是一个运行两个后台任务的简单异步循环。 它们都执行简单的计数。第一个永远重要,包裹在尝试/除外。第二个数到 5,然后取消第一个,停止循环。 有两种方法可以确保取消完成 - asyncio.wait
我是一名优秀的程序员,十分优秀!