我以前从未有机会使用 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_init
和 PTHREAD_MUTEX_INITIALIZER
创建的。事实上,C 语言还保证在程序启动时将未初始化的全局变量清零。因此,您可能看起来不需要初始化 pthread_mutex_t
对象,但事实并非如此。特别是位于堆栈或堆上的内容通常不会被清零。
在pthread_lock
之后调用pthread_mutex_init
肯定会产生不良后果。它将覆盖该变量。潜在结果:
- 互斥体被解锁。
- 另一个线程尝试获取锁的竞争条件,导致崩溃。
- 库或内核中泄漏的资源(但将在进程终止时释放)。
关于c - 在 pthread_mutex_init 之前调用 pthread_mutex_lock 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101136/