我编写了一个简单的类,我计划将其扩展为客户端套接字编程应用程序的一部分。类涉及一个BlockingQueue(我从这里复制了代码:相当于Java的BlockingQueue的C++)。当我创建了下面的包装类的一个实例后,我打算让它生成一个单独的线程,该线程只需执行BlockingQueue上阻塞的printer()函数,直到有一个或多个字符串可用,然后它只需将字符串打印到控制台窗口。在我的预期应用程序中,控制台打印将被一个更耗时的网络功能所取代,该功能涉及发送数据包、等待接收方的确认和一些错误处理。但现在,我只是想让它在不崩溃的情况下打印到控制台窗口。当我执行时,它会在打印任何东西之前立即崩溃。
#include <iostream>
#include <thread>
#include "BlockingQueue.h"
using namespace std;
class Wrapper {
public:
Wrapper() {
threadObj1 = thread(&Wrapper::printer, this);
}
void submitStringToWrite(string str) {
queue.push(str);
}
void printer() {
while(true) {
string str = queue.pop();
cout << str.c_str() << endl;
}
}
private:
BlockingQueue<string> queue;
std::thread threadObj1;
};
int main() {
Wrapper *w = new Wrapper();
w->submitStringToWrite("One");
w->submitStringToWrite("Two");
w->submitStringToWrite("Three");
system("pause");
return 0;
}
下面是阻塞队列的实现,借用了上面的链接:
#include <mutex>
#include <condition_variable>
#include <deque>
template <typename T>
class BlockingQueue
{
private:
std::mutex d_mutex;
std::condition_variable d_condition;
std::deque<T> d_queue;
public:
void push(T const& value) {
{
std::unique_lock<std::mutex> lock(this->d_mutex);
d_queue.push_front(value);
}
this->d_condition.notify_one();
}
T pop() {
std::unique_lock<std::mutex> lock(this->d_mutex);
this->d_condition.wait(lock, [=]{ return !this->d_queue.empty(); });
T rc(std::move(this->d_queue.back()));
this->d_queue.pop_back();
return rc;
}
};
@谢夫在评论区的回答是正确的。我修复了上面的代码。现在起作用了。我无法在两天内结束这个问题。主持人们,你们可以继续结束这个问题了。
我正在编写一个有3个线程的程序。一个读取一个文本文件并将单词输入到大小为2的ArraylistBlockingQueue中。下一个获取该列表并反转其中的每个其他单词。最后一个线程获取单词并将它们写入一个新的文本文件。 我所有的东西都在工作,除了我不知道如何中断和停止我的线程。程序写入文本文件,但从未结束。 主要方法 输入 反向类@重写公共void run(){ 输出代码@覆盖公共无效run(){
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法 方法\处
问题内容: 我在一个非常简单的生产者-消费者场景中使用 java.util.concurrent.BlockingQueue 。例如,此伪代码描述了使用者部分: 到目前为止,一切都很好。在阻塞队列的javadoc中,我读到: BlockingQueue本质上不支持任何类型的“关闭”或“关闭”操作,以指示将不再添加任何项目。这些功能的需求和使用往往取决于实现。例如,一种常见的策略是让生产者插入特殊的
blpop key1...keyN timeout 从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对ke
下面是两种主要的方法。 代码:
我有一个应用程序,在其中按下开始按钮后,服务将开始轮询几个传感器,每当传感器值发生变化时,将传感器数据存储到某个对象中。每10毫秒,就会发生一次数据库插入,获取对象的当前值并将其存储到数据库中。这会发生30分钟 考虑到插入的速度和持续时间,我想在一个独立于UI线程的线程中运行它,这样导航就不会受到影响。因此,我的服务将通过将数据添加到队列中来为线程提供一些数据,然后另一个线程(消费者)将从队列中取