我之前从未有机会使用pthreads库,但我正在审查一些涉及pthread互斥体的代码.我检查了文档pthread_mutex_lock
和pthread_mutex_init
,和我从阅读的手册页这两种功能的理解是,我得叫pthread_mutex_init
我打电话之前pthread_mutex_lock
.
但是,我问了几个同事,他们认为在打电话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
,例如此示例
编辑#2:这是我正在审查的代码.请注意,configure函数获取并附加到某些未初始化的共享内存.稍后将使用Java代码调用lock()
,而不会在其间调用其他本机函数.链接到代码
该POSIX标准说:
如果
mutex
不引用初始化的互斥对象,行为pthread_mutex_lock()
,pthread_mutex_trylock()
和pthread_mutex_unlock()
是不确定的.
所以你需要初始化互斥锁.这可以通过致电来完成pthread_mutex_init()
; 或者,如果互斥锁具有静态存储持续时间,则使用静态初始化程序PTHREAD_MUTEX_INITIALIZER
.例如:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)
互斥体是包含函数需要完成其工作的状态(信息)的变量.如果不需要信息,则例程不需要变量.同样,如果您向其提供随机垃圾,则例程无法正常运行.
大多数平台都接受填充零字节的互斥对象.这通常是什么 pthread_mutex_init
和PTHREAD_MUTEX_INITIALIZER
创造.碰巧的是,C语言还保证在程序启动时将未初始化的全局变量清零.因此,您可能看起来不需要初始化pthread_mutex_t
对象,但事实并非如此.特别是生活在堆栈或堆上的东西通常不会归零.
调用pthread_mutex_init
后 pthread_lock
是肯定有不良的后果.它会覆盖变量.可能的结果:
归档时间: |
|
查看次数: |
4409 次 |
最近记录: |