调用线程的互斥锁API可以不加-lpthread选项?
发现了一个奇怪的问题,代码如下#include <stdio.h>#include <stdlib.h>
#include <string.h>
#include <pthread.h>
int main()
{
int err;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 第一次加锁
err = pthread_mutex_lock(&mutex);
if (err != 0) {
fprintf(stderr, "first lock: %s", strerror(err));
exit(1);
}
// 第二次加锁
err = pthread_mutex_lock(&mutex);
if (err != 0) {
fprintf(stderr, "second lock: %s", strerror(err));
exit(1);
}
printf("never reach here\n");
pthread_mutex_unlock(&mutex);
return 0;
}如果我用命令 gcc -o test test.c编译,也就是不加上-lpthread选项,能够编译通过,并且运行时打印出“never reach here”然后退出。如果加上-lpthread选项编译,运行时就会死锁。
请问大家这是为什么呢,我不链接到pthread库,难道还有其他库可以提供互斥锁API的二进制代码?调用线程的互斥锁API可以不加-lpthread选项? 回复 1# nwcfafniw
不加上-lpthread选项pthread_mutex_lock根本不生效是个空“调用”,ELF格式的程序调用动态库的实际过程是call ->plt -> got ,链接器负责把具体的动态库填充到got中,因为你没有指定所有这个动作就是个空操作(不是nop)。使用pthread相交调用的时候一定要链接pthread库的。 myworkstation 发表于 2013-09-26 14:07 static/image/common/back.gif
回复 1# nwcfafniw
好的,可是还有一个问题,为什么调用其他API如pthread_create的时候,如果没有-lpthread选项,就会出现报错信息
undefined reference to `pthread_create'
而互斥锁API没有-lpthread选项,却依然能够通过编译,这又是为什么? 回复 3# nwcfafniw
因为libc库本身有pthread_mutex_unlock这个符号所以没有出错。 本帖最后由 nwcfafniw 于 2013-09-26 22:39 编辑
myworkstation 发表于 2013-09-26 15:30 static/image/common/back.gif
回复 3# nwcfafniw
用nm查看了下,原来是这样,十分感谢你!
页:
[1]