Код выхода -11 «Ошибка сегментации» при выполнении pthread_create

Я пытаюсь создать новый поток, выполнив pthread_create с одним аргументом.

void P2FPanel::startRecording()
{
  qDebug() << "Start recording...";
  qDebug() << "_bag_list: " << _bag_list->size();
  pthread_create(&_playBags_t, NULL, playBags, _bag_list);
  qDebug() << ".... Started";
}

Этот метод запускается кнопкой и создает pthread. Здесь код уже выходит с ошибкой -11 (я думаю, это ошибка сегментации). Строки отладки показывают, что _bag_list не пуст.

void* P2FPanel::*playBags(void* arg0)
{
  qDebug() << "Play Bags from _bag_list...";
  QList<BagRef*> *bag_list = (QList<BagRef*>*) arg0;
  qDebug() << "Play " << QString("%1").arg(bag_list->size()) << " Bags";
  //Do stuff
  qDebug() << "Finished playing";
  return 0;
}

Этот метод должен выполняться в новом потоке.

class P2FPanel: public rviz::Panel
{

  private Q_SLOTS:
    void startRecording();

  private:
    QList<BagRef*> *_bag_list;
    void* (*playBags)(void* arg0);
    pthread_t _playBags_t;

};

Заголовочный файл.

Откуда ошибка? Правильно ли объявлен метод threaded?

Заранее спасибо, с уважением, Джош


person Josch    schedule 04.02.2013    source источник
comment
Есть ли какая-то особая причина не использовать QThread?   -  person Nemanja Boric    schedule 04.02.2013
comment
Я не знал, что существуют QThreads. Спасибо за подсказку, они еще проще в использовании.   -  person Josch    schedule 05.02.2013


Ответы (1)


Насколько я помню, вы не можете передавать классовые методы в pthreads. Рассмотрим: это и что. Вы должны использовать статические методы.

person bash.d    schedule 04.02.2013
comment
Не за что :) У меня тоже когда-то была эта проблема, и это заняло у меня некоторое время! - person bash.d; 04.02.2013