- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 Qt 中构建了自己的阻塞队列,但遇到了一些问题。如果我不关闭队列,那么我会在控制台中收到错误消息“QWaitCondition:线程仍在等待时已销毁
”。另一方面,我在关闭队列后收到访问冲突异常(无论它是在构造函数中还是来自另一个线程)。异常发生在等待条件的 wait 方法中。
这是我的阻塞队列:
#ifndef BLOCKING_QUEUE_H
#define BLOCKING_QUEUE_H
#include <QObject>
#include <QSharedPointer>
#include <QWaitCondition>
#include <QMutex>
#include <queue>
namespace Concurrency
{
template<typename Data>
class BlockingQueue
{
private:
QMutex _mutex;
QWaitCondition _monitor;
volatile bool _closed;
std::queue<QSharedPointer<Data>> _queue;
public:
BlockingQueue()
{
_closed = false;
}
~BlockingQueue()
{
Close(); // When this is enabled, I get an access violation exception in TryDequeue
}
void Close()
{
QMutexLocker locker(&_mutex);
if(!_closed)
{
_closed = true;
_queue.empty();
_monitor.wakeAll();
}
}
bool Enqueue(QSharedPointer<Data> data)
{
QMutexLocker locker(&_mutex);
// Make sure that the queue is not closed
if(_closed)
{
return false;
}
_queue.push(data);
// Signal all the waiting threads
if(_queue.size()==1)
{
_monitor.wakeAll();
}
return true;
}
bool TryDequeue(QSharedPointer<Data>& value, unsigned long time = ULONG_MAX)
{
QMutexLocker locker(&_mutex);
// Block until something goes into the queue
// or until the queue is closed
while(_queue.empty())
{
if(_closed || !_monitor.wait(&_mutex, time)) // <-- Access violation if I call close in the destructor
{
return false;
}
}
// Dequeue the next item from the queue
value = _queue.front();
_queue.pop();
return true;
}
};
}
#endif BLOCKING_QUEUE_H
我假设发生这种情况是因为等待的线程在队列已经被销毁并且互斥锁随后也被销毁后收到信号。当线程在 TryDequeue
中被唤醒时,不再分配互斥量,因此会导致访问冲突异常。避免这种情况的最佳方法是什么?
最佳答案
我遇到的问题与线程方法有关,有关更多信息,请查看以下问题:Why is QThread::finished signal not being emitted?
使用 BlockingQueue
的服务没有正确关闭在队列中等待的线程,随后导致队列被销毁,而线程仍在 中等待TryDequeue
方法。
关于c++ - BlockingQueue 的 QWaitCondition : Destroyed while threads are still waiting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13424586/
我正在 Qt 中编写一些线程,但我不知道如何将谓词传递给我的条件变量以防止虚假唤醒。 C++ 中的工作解决方案: std::mutex(mu); std::condition_variable con
我的 Qt 应用程序有一个工作线程,可在可用时处理新数据。到目前为止,工作线程使用 QWaitCondition 在新数据可用时唤醒。 但是,QWaitCondition 仅在线程通过 wait()
我有一个数据结构,我想在其中等待它接收数据。当我调用 setInterrupt 时,我希望我的线程停止但它永远不会返回。 这是我的队列: BufferedIpQqueue::BufferedIpQ
我正在熟悉 QT5 并发库。我正在查看 QWaitCondition 示例 ( http://qt-project.org/doc/qt-5.0/qtcore/qwaitcondition.html#
我的代码有问题,我需要你帮助我。我得到: step 1 step 2 QSslSocket: cannot resolve TLSv1_1_client_method QSslSocket: cann
我实现了一个类,它可以通过 QQueue 将数据写入串行端口并通过插槽从中读取数据。我为此使用 QAsyncSerial,它又使用带有回调的 boost::asio。当 QThread 发出“star
我正在使用 pyside,但(我认为)是一个通用的 Qt 问题。 我知道 QThread 实现调用 ._exec() 方法,所以我们应该在启动的 QThread 上有一个事件循环。这样我们就可以在该线
我已经对一些几何图形进行了线程迭代生成。我使用 VTK 进行渲染。每次迭代后,我想显示(渲染)当前进度。我的方法按预期工作,直到最后 2 个线程挂起等待 QWaitCondition。它们被阻止,即使
我在 Qt 中构建了自己的阻塞队列,但遇到了一些问题。如果我不关闭队列,那么我会在控制台中收到错误消息“QWaitCondition:线程仍在等待时已销毁”。另一方面,我在关闭队列后收到访问冲突异常(
Qt 是否提供与Concurrency::event 行为方式大致相同的同步原语?来自 Microsoft 的并发运行时? 具体来说,我希望线程 A 中的 wait() 返回,即使它在线程 B 已经调
我是一名优秀的程序员,十分优秀!