Undefined ссылка на `pthread_mutex_trylock '

У меня есть следующая тестовая программа.

#include <iostream>
#include <cstdlib>

using namespace std;    
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

int main(int argc, char *argv[])
{
  int iret;
  iret = pthread_mutex_trylock( & mymutex );
  cout << "Test2 !!! " << endl;
  pthread_mutex_unlock( & mymutex );
  return EXIT_SUCCESS;
}

Если я скомпилирую его без добавления библиотеки pthread, я получаю ошибку для неразрешенной ошибки для pthread_mutex_trylock, но только для функции pthread_mutex_trylock.

Если я заменил pthread_mutex_trylock на pthread_mutex_trylock, программа будет скомпилирована и запущена также без опции -lpthread *.

Если я добавлю параметр -lpthraed в команды компиляции, все работает хорошо это хорошо работает: $g++ test2.c -o test2 -lpthread это предупреждение не разрешено: $g++ test2.c -o test2

Пример вывода ошибки:   $ g++ test2.c -o test2   /tmp/ccU 1bBdU.o: В функции main': test2.c:(.text+0x11): undefined reference to pthread_mutex_trylock '   collect2: ld возвращен 1 статус выхода

Если я заменил команду iret = pthread_mutex_trylock (и mymutex);

с iret = pthread_mutex_lock (и mymutex); программа компилируется и запускается без ошибок также, если не добавляла pantread libarry в команду компиляции Я знаю, что правильно иметь нерешенную ошибку, если я не использовал параметр -lpthread, но почему у меня нет той же неразрешенной ошибки и для другой функции pthread_?

Я использую gcc 4.4.2 на fedora 12

$ g++ --version
g++ (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20)
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Есть ли у некоторых предложения о значении этого не упоминания только для pthread_mutex_trylock?

спасибо за помощь, Enzo

Ответ 1

Если вы используете функции pthread, вы должны связать свои объектные файлы с -lpthread и не беспокоиться о том, включены ли символы в libc.

Обоснованием этого является сказал, чтобы быть таким: некоторое время назад заглушки в libc использовались, когда приложение, использующее потоки, выполнялось на без поддержки резьбы. В такой системе функции pthread_* стали связанными с libc заглушками, которые возвращали ошибки, показывающие, что нет функции потоковой передачи. В то время как на "поточных" системах они были связаны с библиотекой pthread и работали правильно.

Очевидно, что функция pthread_mutex_trylock появилась после изменения политики на связь с -lpthread. Так что там нет заглушки.

Ответ 2

Вы должны выполнить как компиляцию, так и связь с опцией -pthread, чтобы быть переносимой. В некоторых системах в компиляции будут добавлены определенные флаги (например, -D_REENTRANT) с указанным -pthread.

Если вам интересно посмотреть, что -pthread сделает с вашими флагами компиляции и ссылок, запустите gcc -dumpspecs.