【发布时间】:2015-10-18 06:45:11
【问题描述】:
我以前从未有机会使用 pthreads 库,但我正在审查一些涉及 pthread 互斥锁的代码。我检查了pthread_mutex_lock 和pthread_mutex_init 的文档,通过阅读这两个函数的手册页我的理解是,我必须在调用pthread_mutex_lock 之前调用pthread_mutex_init。
但是,我问了几个同事,他们认为可以先拨打pthread_mutex_lock,然后再拨打pthread_mutex_init。我正在审查的代码也调用了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(),中间不会调用其他本机函数。 Link to code
【问题讨论】:
-
当然当然你不应该在未初始化的情况下使用它......就像任何其他未初始化的数据一样。但是,有一些方法可以在不调用
pthread_mutex_init()的情况下初始化互斥锁(例如PTHREAD_MUTEX_INITIALIZER宏) -
在您链接到的示例中,他们在文件范围内声明互斥锁,因此将其清零......他们可能假设清零
pthread_mutex_t是一个有效状态已解锁的互斥锁...或未显示初始化代码。 -
我明白了。抱歉,我刚刚添加了第二次编辑。看起来我正在审查的代码也做了类似的事情,因为 shmget 应该将内存区域清零。即使在这些情况下,调用 pthread_mutex_init 仍然是个好主意吗?
-
清零的pthread_mutex_t其实是一个有效的状态,但是按照标准,mutex必须初始化,所以使用PTHREAD_MUTEX_INITIALIZER或者pthred_mutex_init()
-
我要么打电话给
pthread_mutex_init(),要么至少使用例如。pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;