c - 在 pthread_mutex_init 之前调用 pthread_mutex_lock 是否安全?

标签 c pthreads mutex

我以前从未有机会使用 pthreads 库,但我正在审查一些涉及 pthread 互斥体的代码。我检查了 pthread_mutex_lock 和 pthread_mutex_init 的文档,通过阅读这两个函数的手册页,我的理解是我必须在调用之前调用 pthread_mutex_init调用pthread_mutex_lock

但是,我问了几个同事,他们认为在调用 pthread_mutex_init 之前调用 pthread_mutex_lock 是可以的。我正在查看的代码还调用了 pthread_mutex_lock,甚至没有调用 pthread_mutex_init

基本上,在调用 pthread_mutex_init 之前调用 pthread_mutex_lock 是否安全且明智(如果 pthread_mutex_init 甚至被调用)?

编辑:我还看到一些在不使用 pthread_mutex_init 时调用 pthread_mutex_lock 的示例,例如 this example

编辑#2:这是我正在审查的具体代码。请注意,配置函数获取并附加到一些未初始化的共享内存。 Java 代码稍后将调用 lock(),中间不会调用其他 native 函数。 Link to code

最佳答案

互斥体是包含函数完成其工作所需的状态(信息)的变量。如果不需要信息,则例程不需要变量。同样,如果您向例程提供随机垃圾,则该例程可能无法正常运行。

大多数平台确实接受填充零字节的互斥对象。这通常是 pthread_mutex_initPTHREAD_MUTEX_INITIALIZER 创建的。事实上,C 语言还保证在程序启动时将未初始化的全局变量清零。因此,您可能看起来不需要初始化 pthread_mutex_t 对象,但事实并非如此。特别是位于堆栈或堆上的内容通常不会被清零。

pthread_lock之后调用pthread_mutex_init肯定会产生不良后果。它将覆盖该变量。潜在结果:

  1. 互斥体被解锁。
  2. 另一个线程尝试获取锁的竞争条件,导致崩溃。
  3. 库或内核中泄漏的资源(但将在进程终止时释放)。

关于c - 在 pthread_mutex_init 之前调用 pthread_mutex_lock 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101136/

相关文章:

c - 如何在C中控制执行时间

c - 按出发日期排序航类

c - 对于相同的两个相同字符串,Strcmp 不会返回零

c - 如何用C读取视频文件

c++ - 线程本地存储和 iOS

c++ - C++线程中的段错误

c - 具有循环缓冲区的多生产者单消费者

c - C语言三线程通信问题(出现死锁)

c++ - 将锁定的 std::unique_lock 移交给新线程

c - C 中带有管道的互斥体