作为一项规则,我被告知应该在返回时测试任何系统调用(或类似的)错误。
使用以下方法初始化pthread互斥锁时
pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;
我们不检查手术是否成功。
但是使用这个宏而不是动态初始化似乎是一种常见的做法。
在这种情况下,是否有必要进行错误检查?
答案 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
,则稍后进行错误检查。