Почему мой массив указателей pthread_t вызывает segfault на pthread_create, но ссылки на pthread_t в массиве не - PullRequest
0 голосов
/ 26 января 2019

Я хочу хранить pthread_t в массиве примерно так:

pthread_t tThreads[nThreads];

Вскоре после этого я перебираю массив с циклом for для запуска потоков

pthread_create( &tThreads[i], NULL, &fn, (void*) NULL);

Я заметил, что я создаю массив pthread_t, использующий объект pthread_t с определенным индексом, затем передаю ссылку на этот pthread_t, чтобы запустить поток.Пытаясь быть умным и уменьшить многословие для себя, я изменил tThreads на массив pthread_t ссылок

pthread_t* tThreads[nThreads];

, чтобы я мог просто создать поток, подобный этому

pthread_create( tThreads[i], NULL, &fn, (void*) NULL);

Проблема в том, что второй метод создает ошибку при попытке создать pthread.Что вызывает это?

1 Ответ

0 голосов
/ 26 января 2019

С помощью pthread_t tThreads[nThreads] вы определяете массив, который непосредственно содержит pthread_t -объекты.Вы можете передать (адрес) каждого такого действительного объекта на pthread_create.

. С помощью pthread_t* tThreads[nThreads], напротив, вы определяете массив из указателей на pthread_t -объектов, ноне pthread_t -объекты сами.Передача такого (неинициализированного) указателя (указывающего «где-то», но не на действительный pthread_t -объект) на pthread_create приведет к неопределенному поведению (например, к segfault).Вам потребуется tThreads[i] = malloc(sizeof(pthread_t)) перед каждым звонком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...