pthread_create ошибка сегментации - PullRequest
5 голосов
/ 03 апреля 2011

Я использую метод 'pthread_create' в своей программе и получаю ошибку сегментации ВНУТРИ ЭТОГО МЕТОДА.
Что может вызвать это? Я вызываю эту функцию с правильными типами аргументов!

это код:

pthread_t* _daemon;


void* writer(void* arg){
    // stuff that dont involve "arg"...
}


int initdevice(){
    if(pthread_create(_daemon, NULL, &writer, NULL) != 0) //seg in this line
    {

      cerr << "system error\n";
      return ERR_CODE;
    }
    return SUCCESS;
}

int main () {
    initdevice();
    return 0;
}  

Примечание: я пытался запустить его также без '&' перед вызовом писателя в pthread_create, а также - мы попытались отправить этому методу некоторый аргумент void * вместо последнего аргумента NULL. *

Ответы [ 2 ]

17 голосов
/ 03 апреля 2011

Ваш пробелем здесь:

pthread_t* _daemon;

Это должно быть:

pthread_t  daemon;

Затем измените вызов на pthread_create:

if(pthread_create(&daemon, NULL, &writer, NULL) != 0)

Идея состоит в том, чтоpthread_create получает указатель на существующий pthread_t объект, чтобы он мог заполнить детали.Вы можете думать об этом как о версии C конструктора.Первоначально объект pthread_t неинициализирован, это инициализирует его.

Кроме того, ваш код, вероятно, все еще не всегда будет работать, поскольку вы не ожидаете завершения потока.Убедитесь, что ваш основной поток не заканчивается до всех дочерних элементов:

int main () 
{
    initdevice();
    pthread_join(daemon, NULL); // wait for the thread to exit first.
    return 0;
}  
1 голос
/ 28 мая 2016

Вы должны выделить _daemon variable с помощью функции new или malloc, потому что вы используете pointer.как ниже:

pthread_t* _daemon;
_daemon = new pthread_t;
...