首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么当程序没有链接到线程库时,pthread_mutex_lock总是返回0(但没有错误)?

为什么当程序没有链接到线程库时,pthread_mutex_lock总是返回0(但没有错误)?
EN

Stack Overflow用户
提问于 2014-08-24 19:07:54
回答 1查看 873关注 0票数 2

我最近偶然发现了一个我认为是相当奇怪的p线程库行为(或者至少在Linux 16,Ubuntu 2.17-93ubuntu4,NPTL 2.17,gcc Ubuntu/Linaro 4.8.1-10 ubuntu9中实现了它)。

在编译p线程程序时,我意外地忘记了将它链接到p线程库(也就是说,我忘了将-lpthread标志添加到gcc命令行)。但是,我编译程序时启用了所有警告(-Wall),绝对没有收到警告或错误。当我运行这个程序时,我想,好像锁根本不起作用一样。我花了一小段时间才弄清楚,但最终我发现,尽管对pthread_mutex_lock的所有调用都返回0(成功),但锁没有被设置(例如,在同一个锁上对pthread_mutex_lock的两个顺序调用不会挂起执行)。

下面是我用来测试和再现行为的概念代码的一个证明:

代码语言:javascript
运行
复制
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标志编译它,我就不会收到任何错误或警告,当我运行它时,它会正常运行并完成执行。

代码语言:javascript
运行
复制
me@mybox /tmp $ gcc -Wall mutex.c -o mutex
me@mybox /tmp $ ./mutex
me@mybox /tmp $

如果我用-lpthread标志编译它,我也不会收到任何错误或警告,但是当我运行它时,它只是挂起(在对pthread_mutex_lock的第二个调用上)--这应该是预期的行为。

代码语言:javascript
运行
复制
me@mybox /tmp $ gcc -Wall mutex.c -o mutex -lpthread
me@mybox /tmp $ ./mutex
^C
me@mybox /tmp $ 

谁能解释一下,当省略-lpthread标志(因此程序没有链接到p线程库)时,编译器不会显示错误或警告,程序在执行过程中也不会显示错误或警告,但是pthread_mutex_lock只是返回0而不保存锁?

谢谢你能提供的任何线索。

EN

Stack Overflow用户

回答已采纳

发布于 2014-08-24 19:51:03

这只是猜测,因为我还没有看过代码,但我相信这个想法是允许库代码(无论是系统级的还是第三方的)在非多线程程序中使用pthread_mutex_lock,而不需要任何开销,也不需要链接libpthread。由于这些程序没有多个线程,所以不需要任何互斥,并且互斥的“虚拟”实现不会造成任何问题,除非互斥以一种不太传统的方式使用(例如使用pthread_mutex_trylock来观察互斥是否已经锁定)。

如果我的怀疑是正确的,这可能是“两害中较轻”。一方面,当您忘记链接pthread_mutex_lock时,使用非工作版本的libpthread就会悄无声息地失败是不对的。这尤其可能影响使用进程共享互斥的程序,这些程序不需要为mmap创建线程并将其用作进程共享互斥对象(另一个创建的程序),在该程序中,您将不会观察到由于缺少pthread_create而产生的其他链接错误,等等,在没有pthread_mutex_lock的情况下使用libpthread符号可以阻止第三方库作者将“线程支持”作为一个可选特性(以避免不得不链接libpthread),并且可能需要在多线程程序中实际无法安全调用的"init线程“函数(这是一个单独的问题,如果您感兴趣的话,我们可以讨论这个问题)。库作者的这种行为过去非常普遍(在某种程度上仍然是如此),使多线程编程比在多线程环境中与“开箱即用”的库进行斗争所造成的痛苦要大得多。所以让人们停止这样做有很大的价值。

事实上,我对这个问题的公认答案支持了我的怀疑:

How to create a library which uses mutexes only if pthread is linked?

此外,互斥体的“虚拟实现”的失败并不是完全沉默的,而是返回错误。你只是没有检查一下而已。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25475293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档