Ошибка шины в OSX - pthreads - PullRequest
2 голосов
/ 25 июля 2010

я пытаюсь разобраться в следующем:

Есть небольшая программа, пытающаяся портировать на OSX (intel), которая вызывает функцию doWork () через pthread_create, в функции я начинаю с созданиямассив long вроде такой:

long myarray[DIMENSION]

на OSX, для следующих значений DIMENSION я получаю следующее:

0->65434 = fine
65435->67037 = SIGBUS
67037+ = SIGSEGV

Я тут совсем запутался, я понимаю, что SIGBUSобычно из-за проблем с выравниванием памяти, я проверил sizeof (long) и на этой платформе он равен 8.Может кто-нибудь указать мне правильное направление документов, которые я должен читать здесь?

Вот источник:


#include pthread.h
#include stdio.h
#define NUM_THREADS     5
#define DIMENSION       12345

void *doStuff(void *threadid)
{
   long array[DIMENSION];
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t lt NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, doStuff, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

1 Ответ

6 голосов
/ 25 июля 2010

Может показаться, что вы переполняете стек.

Вам потребуется либо превратить длинный массив в неправильный, либо использовать pthread_attr_setstacksize и friends, чтобы создать больший стек при вызове pthread_create.

Размеры стека потоков по умолчанию сильно различаются перед платформами, что объясняет, почему код работает на других платформах.

https://computing.llnl.gov/tutorials/pthreads/#Stack имеет некоторый пример кода.

Какпочему вы получаете sigbus, возможно, потому что процесс создания массива перезаписывает некоторую часть внутренних структур данных pthreads мусором, что приводит к ошибке выравнивания, когда pthreads пытается очистить поток.

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