对“pthread_mutex_trylock”的未定义引用

Posted

技术标签:

【中文标题】对“pthread_mutex_trylock”的未定义引用【英文标题】:undefined reference to `pthread_mutex_trylock' 【发布时间】:2010-01-05 22:32:02 【问题描述】:

我有以下测试程序。

#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/ccU1bBdU.o:在函数main': test2.c:(.text+0x11): undefined reference topthread_mutex_trylock' collect2: ld 返回 1 个退出状态

如果我替换指令 iret = pthread_mutex_trylock( & mymutex );

使用 iret = pthread_mutex_lock( & mymutex ); 如果没有将 pthread 库添加到编译命令中,程序也会编译并运行而不会出错 我知道如果我不使用 -lpthread 选项,出现未解决的错误是正确的,但为什么其他 pthread_ 函数也没有相同的未解决错误?

我在 fedora 12 上使用 gcc 4.4.2

$ 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 的取消引用的含义有一些建议?

感谢恩佐的帮助

【问题讨论】:

这可能是一些特定于平台的行为,但你为什么还要打扰呢?您应该与 pthread 链接,就这样做吧。 我还是有学习的意愿:) 尽管如此,这个问题在像我这样的情况下很有用,在这种情况下,对 pthread_mutex_lock() 的调用被 pthread_mutex_trylock() 取代,导致事情无缘无故地中断。 【参考方案1】:

如果您使用 pthread 函数,您应该将您的目标文件与-lpthread 链接起来,而不用担心符号是否包含在libc 中。

这背后的基本原理是said 是这样的:前一段时间,当使用线程的应用程序在没有线程支持的系统上运行时,会使用 libc 中的存根。在这样的系统上,pthread_* 函数链接到 libc 存根,该存根返回的错误表明没有线程功能。在“线程”系统上,它们链接到 pthread 库并正常工作。

显然,pthread_mutex_trylock 函数是在策略更改为与-lpthread 链接后出现的。所以没有存根。

【讨论】:

感谢 Pavel,现在这种奇怪的行为我更清楚了。问候,ebzo 顺便说一句,-lpthread 不可移植,尤其是旧版本的 BSD 使用 libc_r,而不是 libpthread。因此,-pthread 更便携,更值得推荐。【参考方案2】:

您应该使用-pthread 选项执行编译和链接,以便可移植。在某些系统上,编译会添加特定的标志(例如,-D_REENTRANT)并指定-pthread

如果您想知道-pthread 会对您的编译和链接标志做什么,请运行gcc -dumpspecs

【讨论】:

以上是关于对“pthread_mutex_trylock”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

Linux 多线程同步机制:互斥量信号量条件变量

多线程同步方法

线程与线程同步

第9章 线程编程_死锁

Linux学习_线程的死锁和信号

逆序对