Russian Qt Forum
Май 02, 2024, 08:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка Segmentation fault при dequeue из очереди QQueue< QByteArray*>  (Прочитано 4726 раз)
pawok11
Гость
« : Сентябрь 03, 2010, 10:50 »

В потоке (поток 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++;
 


Записан
pawok11
Гость
« Ответ #1 : Сентябрь 08, 2010, 15:13 »

Причина ошибки так и не была найдена Грустный

Переделано с использованием семафоров:)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 08, 2010, 15:33 »

А чего для потока 2 используете lockForRead если dequeue модифицирует очередь т.е. пишет?
Записан
pawok11
Гость
« Ответ #3 : Сентябрь 09, 2010, 13:19 »

Ваша правда.

Но использование просто мьютексов QMutex, давало тот же самый результат, т.е. приводило к той же самой ошибке.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 22.