使用PTHREAD_MUTEX_INITIALIZER宏时检查错误

时间:2014-04-29 08:45:28

标签: c++ pthreads

作为一项规则,我被告知应该在返回时测试任何系统调用(或类似的)错误。

使用以下方法初始化pthread互斥锁时

pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER; 

我们不检查手术是否成功。

但是使用这个宏而不是动态初始化似乎是一种常见的做法。

在这种情况下,是否有必要进行错误检查?

2 个答案:

答案 0 :(得分:2)

不需要错误检查的原因是因为静态 初始化不能失败。在最常见的实现中, PTHREAD_MUTEX_INITIALIZER将是符合的 0{}(取决于pthread_mutex_t的定义方式),to 确保零初始化,以及各种系统调用 使用pthread_mutex_t的设计用于处理零 初始化pthread_mutex_t,好像它已被初始化为 所有默认值,因为类型是设计的 明确地这样,或者因为例程使用惰性 初始化。

(请注意,PTHREAD_MUTEX_INITIALIZER不能同时发生任何事情 __special_mutex_initializer()的行,因为它可以 用于在C中初始化文件范围静态变量 C需要编译时常量表达式 初始化静态变量。)

编辑:

有关详细信息,您可能需要阅读基本原理 部分 http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_init.html。 这描述了几种不同的可能实现,以及 所涉及的一些权衡因素。

答案 1 :(得分:0)

来自IBM

  

注意:使用PTHREAD_MUTEX_INITIALIZER进行互斥初始化   不能立即初始化互斥锁。相反,在第一次使用时,   pthread_mutex_lock()或pthread_mutex_trylock()函数分支到   缓慢的路径并导致互斥锁的初始化。因为是一个互斥体   不仅仅是一个简单的内存对象,而且需要一些资源   由系统分配,尝试调用pthread_mutex_destroy()或   pthread_mutex_unlock()在静态初始化的互斥锁上   使用PTHREAD_MUTEX_INITIALER并且尚未锁定会导致EINVAL   错误。

如果您使用PTHREAD_MUTEX_INITIALIZER,则稍后进行错误检查。