Я столкнулся со странным явлением: моя программа на C не работает с определенным количеством потоков, например. 8.
Когда я отлаживаю с помощью «fprintf», я обнаружил, что проблема возникает при создании pthreads:
298 /* work for each thread */
299 void* work(void *t)
300 {
301 long tid;
302 tid = (long)t;
303 fprintf(stderr, "In thread %lu\n", tid);
304
...
368 pthread_exit((void*)t);
369 }
513 /* main function */
514 int my_main(struct Params params)
515 {
...
pthread_t* threads;
threads = malloc(threads_num * sizeof(pthread_t));
574 long t;
575 int rc;
576 for (t=0; t<threads_num; t++)
577 {
578 fprintf(stderr, "create %lu\n", t);
579 rc = pthread_create(&threads[t], NULL, work, (void*)t);
580 if(rc)
581 {
582 printf("ERROR: return code from pthread_creat() is %d\n", rc);
583 exit(-1);
584 }
585 }
...
599 for(t=0; t<threads_num; t++)
600 pthread_join(threads[t], NULL);
...
615 return 0;
616 }
Результаты выглядят так:
create 0
create 1
create 2
create 3
create 4
create 5
In thread 0
In thread 3
In thread 4
create 6
In thread 1
In thread 2
In thread 5
create 7
In thread 6
Segmentation fault
Какие потенциальные проблемы могут возникнуть для потока 7? Есть предположения?
Другая информация может быть полезна: Коды хорошо работают на моем MacBook Pro с GCC в качестве компилятора. Проблемы здесь в тех случаях, когда я компилирую их на некоторых серверах Linux (openSUSE) с GCC.