В потоке (поток 0) запускаются два потока (поток 1 и поток 2): один получает данные из сети и кладет их в очередь, другой их достает из очереди и обрабатывает.
Очередь и мютекс на очередь объявлены в потоке 0:
C++ (Qt)
QQueue<QByteArray *> * inDataLayerQueue = new QQueue<QByteArray *>();
QReadWriteLock *lock = new QReadWriteLock();
Поток 1 получает данные и кладет их в очередь
C++ (Qt)
void DataLayerBroadCastServerThread::run()
{
...
while(res >= 0)
{
res = dl->readOne();
if(res == 0)
{
usleep(10);
continue;
}
QByteArray array = dl->getPacket();
QByteArray *pArray = new QByteArray(array);
lock->lockForWrite();
inDataLayerQueue->enqueue(pArray);
lock->unlock();
}
}
Поток 2:
C++ (Qt)
void HandlerDataLayer::run()
{
forever
{
if (stopped)
{
return;
}
lock->lockForRead();
if (inDataLayerQueue->isEmpty())
{
usleep(100);
lock->unlock();
continue;
}
QByteArray *pArray = inDataLayerQueue->dequeue();
lock->unlock();
...
delete pArray;
}
}
Ошибка Segmentation fault появляется в строке:
C++ (Qt)
QByteArray *pArray = inDataLayerQueue->dequeue();
Вопрос что не так и как еще можно организовать передачу данных между потоками?
Debuger показывает:
C++ (Qt)
7.QByteArray *pArray = inDataLayerQueue->dequeue();
6.inline T dequeue() { return QList<T>::takeFirst(); }
5.inline T QList<T>::takeFirst()
{ T t = first();removeFirst(); return t; }
4.inline void removeFirst() { Q_ASSERT(!isEmpty()); erase(begin()); }
3.inline typename QList<T>::iterator QList<T>::erase(iterator it)
{ node_destruct(it.i);
return reinterpret_cast<Node *>(p.erase(reinterpret_cast<void**>(it.i))); }
2.void **QListData::erase(void **xi)
{
Q_ASSERT(d->ref == 1);
int i = xi - (d->array + d->begin);
remove(i);
return d->array + d->begin + i;
}
1.void QListData::remove(int i)
...
if (int offset = i - d->begin)
::memmove(d->array + d->begin + 1, d->array + d->begin, offset * sizeof(void *));
d->begin++;