2010-01-05 2 views
10

У меня есть следующая тестовая программа.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 возможность компиляции команд все хорошо работает это хорошо работать: $ г ++ test2.c -o test2 -lpthread это предупредит нерешенным: $ г ++ test2.c -o test2

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

Если я заменю instructi на iret = pthread_mutex_trylock (& mymutex);

с iret = pthread_mutex_lock (& mymutex); программа компилируется и запускается без ошибок также, если не добавляла pthread 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. 

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

спасибо за помощь, Энцо

+5

Это может быть поведение определенной платформы, но почему вы даже беспокоитесь? Вы должны связываться с pthread, просто сделайте это. –

+0

mybe У меня еще есть желание узнать :) – enzo2

+1

Тем не менее этот вопрос полезен в такой ситуации, как мой, где вызов 'pthread_mutex_lock()' был заменен на 'pthread_mutex_trylock()', заставляя вещи сломаться без видимой причины. – foraidt

ответ

14

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

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

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

+0

благодарю Павла, теперь это странное поведение, которое я чувствую. regars, ebzo – enzo2

+2

BTW, '-lpthread' не является переносным, и, в частности, в старых версиях BSD используется' libc_r', а не 'libpthread'. Таким образом, '-pthread' более портативен и рекомендуется. –

14

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^