pthread_join всегда вызывает SIGSEGV

По какой-то причине pthread_join всегда вызывает действие SIGSEGV на моем компьютере, когда я запускаю Valgrind. Чтобы проверить это, я запустил следующий код с сайта https://computing.llnl.gov/tutorials/pthreads/. :

/* pthread.c */

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUM_THREADS 4

void *BusyWork(void *t)
{
  int i;
  long tid;
  double result=0.0;
  tid = (long)t;
  printf("Thread %ld starting...\n",tid);
  for (i=0; i<1000000; i++)
  {
    result = result + sin(i) * tan(i);

  }
  printf("Thread %ld done. Result = %e\n",tid, result);
  pthread_exit((void*) t);

}

int main (int argc, char *argv[])
{
  pthread_t thread[NUM_THREADS];
  pthread_attr_t attr;
  int rc;
  long t;
  void *status;

  /* Initialize and set thread detached attribute */
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

  for(t=0; t<NUM_THREADS; t++) {
    printf("Main: creating thread %ld\n", t);
    rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t); 
    if (rc) {
      printf("ERROR; return code from pthread_create() is %d\n", rc);
      exit(-1);

    }

  }

  /* Free attribute and wait for the other threads */
  pthread_attr_destroy(&attr);
  for(t=0; t<NUM_THREADS; t++) {
    rc = pthread_join(thread[t], &status);
    if (rc) {
      printf("ERROR; return code from pthread_join() is %d\n", rc);
      exit(-1);

    }
    printf("Main: completed join with thread %ld having a status   of %ld\n",
        t,(long)status);

  }

  printf("Main: program completed. Exiting.\n");
  pthread_exit(NULL);
}

Бег

$ clang -g -o pthread pthread.c
$ valgrind --leak-check=full ./pthread

Выдает следующую ошибку valgrind:

==17283== Process terminating with default action of signal 11 (SIGSEGV)
==17283==  Access not within mapped region at address 0x700002F3CC3E
==17283==    at 0x10044437F: _pthread_find_thread (in /usr/lib/system/libsystem_pthread.dylib)
==17283==    by 0x100446D52: _pthread_join_cleanup (in /usr/lib/system/libsystem_pthread.dylib)
==17283==    by 0x100446C63: pthread_join (in /usr/lib/system/libsystem_pthread.dylib)
==17283==    by 0x100000D52: main (pthread.c:50)

Мой компьютер — Mac OS X (El Capitan). Для clang я использую Apple LLVM версии 7.0.2 (clang-700.1.81). Для Valgrind я использую valgrind-3.11.0.


person ethanabrooks    schedule 24.02.2016    source источник
comment
У меня точно такая же проблема с простым С++: stackoverflow.com/questions/36576251/   -  person KevinD    schedule 16.05.2016
comment
По ссылке KevinD есть официальный отчет об ошибке, но это может быть проблема с libpthread. Это также, по-видимому, вызывает сбой утверждения в режиме leak-check на Mac, re: который Philippe W. имеет заявлено без репродуктора на linux мало шансов [sic] найти проблему с удаленной отладкой по почте   -  person    schedule 09.01.2017


Ответы (1)


Мне не удалось воспроизвести вашу проблему на моем Mac OS X Yosemite (10.10.5) с ядром 14.5.0. Версии Clang и Valgrind, которые я использую, такие же, как у вас (пожалуйста, проверьте на всякий случай):

$ clang --version
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

$ valgrind --version
valgrind-3.11.0

Таким образом, разница только в версии ОС. Вот шаги, которые я выполнил:

  1. Обновил установку инструментов разработчика, запустив xcode-select --install. Без этого я не смог бы построить Valgrind.
  2. Задайте для переменных среды CC и CXX значения clang и clang++ соответственно. Я сделал это, чтобы убедиться, что используется Clang, а не GCC. Настройка CXX, вероятно, была излишней. Позже я стер установку Valgrind и переделал ее с помощью GCC, но это все равно было успешно, хотя я думаю, что получил больше предупреждений.
  3. Сделал ./configure --prefix=/usr/local в корне нетарированного архива Valgrind, а затем make и sudo make install.

Надеюсь, эти шаги помогут вам решить проблему.

person Anatoli P    schedule 24.02.2016
comment
Спасибо за предложение. Я обновил свой пост с информацией, которую вы просили. Когда я запускаю программу без valgrind, у меня нет проблем. - person ethanabrooks; 25.02.2016