nwcfafniw 发表于 2013-09-26 10:31

调用线程的互斥锁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选项?

myworkstation 发表于 2013-09-26 14:07

回复 1# nwcfafniw


    不加上-lpthread选项pthread_mutex_lock根本不生效是个空“调用”,ELF格式的程序调用动态库的实际过程是call ->plt -> got ,链接器负责把具体的动态库填充到got中,因为你没有指定所有这个动作就是个空操作(不是nop)。使用pthread相交调用的时候一定要链接pthread库的。

nwcfafniw 发表于 2013-09-26 14:46

myworkstation 发表于 2013-09-26 14:07 static/image/common/back.gif
回复 1# nwcfafniw



好的,可是还有一个问题,为什么调用其他API如pthread_create的时候,如果没有-lpthread选项,就会出现报错信息
undefined reference to `pthread_create'
而互斥锁API没有-lpthread选项,却依然能够通过编译,这又是为什么?

myworkstation 发表于 2013-09-26 15:30

回复 3# nwcfafniw


    因为libc库本身有pthread_mutex_unlock这个符号所以没有出错。

nwcfafniw 发表于 2013-09-26 22:37

本帖最后由 nwcfafniw 于 2013-09-26 22:39 编辑

myworkstation 发表于 2013-09-26 15:30 static/image/common/back.gif
回复 3# nwcfafniw



用nm查看了下,原来是这样,十分感谢你!
页: [1]
查看完整版本: 调用线程的互斥锁API可以不加-lpthread选项?