2010-01-05 36 views
10

Tôi có chương trình thử nghiệm sau đây.tham chiếu không xác định đối với `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; 
} 

Nếu tôi biên dịch nó mà không cần thêm thư viện pthread tôi nhận được lỗi cho lỗi chưa được giải quyết cho pthread_mutex_trylock, nhưng chỉ dành cho chức năng pthread_mutex_trylock.

Nếu tôi thay thế pthread_mutex_trylock bằng pthread_mutex_trylock thì chương trình được biên dịch và cũng chạy cũng không có tùy chọn -lpthread *.

Nếu tôi thêm tùy chọn -lpthraed cho biên dịch lệnh tất cả chạy tốt này chạy tốt: $ g ++ test2.c -o test2 -lpthread này cảnh báo chưa được giải quyết: $ g ++ test2.c -o test2

ra lỗi

Ví dụ: $ g ++ test2.c -o test2 /tmp/ccU1bBdU.o: Trong chức năng main': test2.c:(.text+0x11): undefined reference to pthread_mutex_trylock' collect2: ld trở về 1 trạng thái thoát

Nếu tôi thay thế instructi trên iret = pthread_mutex_trylock (& mymutex);

với iret = pthread_mutex_lock (& mymutex); chương trình biên dịch và chạy mà không có lỗi cũng nếu không thêm libarry pthread vào lệnh biên dịch Tôi biết rằng có quyền có lỗi chưa được giải quyết nếu tôi không sử dụng tùy chọn -lpthread, nhưng tại sao tôi không giống nhau lỗi chưa được giải quyết cũng cho chức năng pthread_ khác?

Tôi đang sử dụng gcc 4.4.2 trên 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. 

Do một số có một số gợi ý về ý nghĩa của unreference này chỉ dành cho pthread_mutex_trylock?

cảm ơn vì sự giúp đỡ, Enzo

+5

Đó có thể là một số hành vi cụ thể cho nền tảng, nhưng tại sao bạn thậm chí còn bận tâm? Bạn có nghĩa vụ phải liên kết với pthread, chỉ cần làm điều đó. –

+0

mybe Tôi vẫn còn ý muốn học :) – enzo2

+1

Tuy nhiên câu hỏi này rất hữu ích trong một tình huống như tôi, nơi mà một cuộc gọi đến 'pthread_mutex_lock()' được thay thế bằng 'pthread_mutex_trylock()' gây ra mọi thứ để phá vỡ không có lý do rõ ràng. – foraidt

Trả lời

14

Nếu bạn sử dụng chức năng pthread, bạn nên liên kết các tệp đối tượng của mình với -lpthread và không phải lo lắng về việc liệu các biểu tượng có được bao gồm trong libc hay không.

Lý do đằng sau trường hợp này là said là như vậy: một số thời gian trước, các phần tử trong libc được sử dụng khi ứng dụng sử dụng luồng được chạy trên hệ thống mà không cần hỗ trợ luồng. Trên hệ thống như vậy, các hàm pthread_* đã được liên kết với số libc khai báo lỗi trả về cho thấy không có chức năng luồng. Trong khi trên hệ thống "luồng", chúng được liên kết với thư viện pthread và hoạt động chính xác.

Rõ ràng, chức năng pthread_mutex_trylock xuất hiện sau khi chính sách thay đổi thành liên kết với -lpthread. Vì vậy, không có stub cho nó.

+0

cảm ơn Pavel, bây giờ hành vi kỳ lạ này tôi đã thấy rõ. regars, ebzo – enzo2

+2

BTW, '-lpthread' không di động, và đặc biệt, các phiên bản cũ hơn của BSD đã sử dụng' libc_r', không phải 'libpthread'. Do đó, '-pthread' dễ di chuyển hơn và được khuyên dùng. –

14

Bạn nên thực hiện cả việc soạn thảo và liên kết với các tùy chọn -pthread, để được cầm tay. Trên một số hệ thống, trình biên dịch sẽ được thêm các cờ cụ thể (ví dụ: -D_REENTRANT) với -pthread được chỉ định.

Nếu bạn muốn tìm hiểu xem -pthread sẽ làm gì với cờ biên dịch và liên kết của bạn, hãy chạy gcc -dumpspecs.

Các vấn đề liên quan