我最近偶然发现了我认为 pthreads 库的一种非常奇怪的行为(或者至少它在 Linux Mint 16、Ubuntu EGLIBC 2.17-93ubuntu4、NPTL 2.17、gcc Ubuntu/Linaro 4.8.1-10ubuntu9 中的实现)。
在编译 pthreads 程序时,我不小心忘记将它与 pthreads 库链接(即,我忘记在 gcc 命令行中添加 -lpthread 标志)。但是,我确实编译了启用所有警告(-Wall)的程序,并且绝对没有收到任何警告或错误。当我运行程序时,我想,好像锁根本不起作用。我花了一点时间才弄明白,但最终我发现尽管所有对 pthread_mutex_lock 的调用都返回 0(成功),但并未设置锁(例如,在同一个锁上对 pthread_mutex_lock 的两次连续调用不会暂停执行)。
这是我用来测试和重现行为的概念验证代码:
int main( int argc, char **argv ) {
pthread_mutex_t mutex;
pthread_mutex_init( &mutex, NULL );
pthread_mutex_lock( &mutex );
pthread_mutex_lock( &mutex );
pthread_mutex_unlock( &mutex );
return 0;
}
如果我在没有 -lpthread 标志的情况下编译它,我不会收到任何错误或警告,当我运行它时,它会正常运行并完成执行。
me@mybox /tmp $ gcc -Wall mutex.c -o mutex
me@mybox /tmp $ ./mutex
me@mybox /tmp $
如果我使用 -lpthread 标志编译它,我也不会收到任何错误或警告,但是当我运行它时,它只是挂起(在第二次调用 pthread_mutex_lock 时)——这应该是预期的行为。
me@mybox /tmp $ gcc -Wall mutex.c -o mutex -lpthread
me@mybox /tmp $ ./mutex
^C
me@mybox /tmp $
任何人都可以解释为什么,当 -lpthread 标志被省略时(因此程序没有链接到 pthreads 库),编译器没有显示错误或警告,程序在执行期间也没有显示,但是 pthread_mutex_lock 只返回 0 并且没有拿着锁?
提前感谢您提供的任何线索。