我之前从未有机会使用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 次 |
| 最近记录: |