微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查pthread_mutex是否被初始化

使用pthreads必须在获取锁之前在任何互斥量上调用pthread_mutex_init()。

根据POSIXlocking一个未初始化的互斥体只为具有优先级保护的互斥体定义( opengroup:pthread_mutex_lock )

根据联机帮助页pthread_mutex_lock.3thr ,如果调用一个未经初始化的互斥锁,它应该返回EINVAL。 假设可移植性不是问题,那么编写如下代码是否有效(一个好主意?):

pthread_mutex_t lock; int ret = pthread_mutex_lock(&lock); if (ret != 0){ if(ret == EINVAL){ pthread_mutex_init(&lock,NULL); } else { /* other error */ } }

是否有另一种方法来检查一个pthread_mutex是否已经初始化?

查看共享对象unix / linux中的c ++方法/构造函数

(通常)任何types的属性的“通用”控制?

mpirun:无法识别的参数mca

TerminateProcess不适用于已validation的进程ID

梯度父窗口上的背景comboBox

整个场景是图书馆的一部分(不幸的是不是C ++),我想避免错误的使用。 也就是说,客户端可以初始化两次创build的对象,可以在正确初始化之前将对象传递给其他函数

目前在对象中有一个标志是否已经初始化了互斥体,我想知道这是否真的有必要。

看看macrosPTHREAD_MUTEX_INITIALIZER对于静态互斥锁初始化的扩展,它只是展开成一个所有成员设置为0的结构体。如果不再需要,我可以假定不需要调用mutex_destroy,因为资源本身被释放如果没有人使用它)?

更新:Jens的答案是绝对正确的 。 以下程序产生完全未定义的行为:

int main(int argc,char** argv) { pthread_mutex_t lock; int ret = pthread_mutex_lock(&lock); if (ret != 0) { printf(" ERR : %d %s n",ret,strerror(ret)); if (ret == EINVAL) { pthread_mutex_init(&lock,NULL); } } else { printf(" ok n"); } pthread_mutex_unlock(&lock); return 0; }

有时它会死锁,有时候它打印好了…..

在Ruby中调用C代码 – 如何使用返回的指针?

replace为Windows XP上的:: SHCreateItemFromParsingName()

是否有可能读取Linux c + +中的udp套接字缓冲区中缓冲了多less字节?

rc.local不在覆盆子pi的启动上运行

在哪里下载所有需要的OpenGL库,包括和编译的DLL来制作最新的游戏?

不,你不能检测到。 EINVAL 可能会返回一个未初始化的互斥量,但它不一定。

另外POSIX声明:

尝试初始化已经初始化的互斥体会导致未定义的行为。

所以你不应该尝试。

最好的办法是完全避免这种情况,并正确初始化变量。 这应该用宏PTHREAD_MUTEX_INITIALIZER 。

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐