[Interest] QQueue::enqueue hangs in QList::append
Ch'Gans
chgans at gna.org
Tue Aug 9 07:06:38 CEST 2016
On 9 August 2016 at 05:09, Nilesh Kokane <nilesh.kokane05 at gmail.com> wrote:
> On Aug 8, 2016 9:06 PM, "Thiago Macieira" <thiago.macieira at intel.com> wrote:
>>
>> On segunda-feira, 8 de agosto de 2016 20:11:38 PDT Nilesh Kokane wrote:
>> > Hello,
>> >
>> > I've a QQueue designed for threadsafe as[1]. I push to the QQueue from
>> > one thread and pop from the other. After several attempts it hangs in
>> > QList::append near node_construct(n, t).
>> >
>> > [1]. https://paste.kde.org/p85706xzb
Your implementation looks a bit weird to me, what about simply (not tested):
ThreadSafeQueue()
{
}
~ThreadSafeQueue()
{
}
T pop()
{
QMutexLocker locker(&mutex);
if (queue.isEmpty())
bufferNotEmpty.wait(&mutex);
return queue.unqueue();
}
push(T)
{
QMutexLocker locker(&mutex);
queue.enqueue(t);
bufferNotEmpty.wakeAll();
}
isEmpty() // I doubt this will achieve what you're after, maybe you're
after the notEmpty/notFull dual wait condition pattern [1]
{
QMutexLocker locker(&mutex);
return queue.isEmpty();
}
clear()
{
QMutexLocker locker(&mutex);
queue.clear();
}
And you could optimise a bit if you have several readers by using a
QReadWriteLock instead of QMutex
My 2 cents.
Chris
[1] eg. https://www.cs.mtu.edu/~shene/NSF-3/e-Book/MONITOR/ProducerConsumer-1/MON-example-buffer-1.html
>> >
>> > Any clue?
>>
>> node_construct can't hang. Your trace is wrong, that's not where it hung.
>
> http://picpaste.com/queue-Xsj4G4h8.png . This is what I get in stack trace.
>
> --
> Nilesh Kokane
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
More information about the Interest
mailing list