gpt4 book ai didi

检查 pthread_mutex 是否初始化

转载 作者:太空狗 更新时间:2023-10-29 11:04:29 26 4
gpt4 key购买 nike

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

根据 POSIX,锁定未初始化的互斥量仅针对具有优先级保护的互斥量 (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 是否已初始化吗?

整个场景是库的一部分(不幸的是政治不是 C++),我想尽量避免错误使用。 IE。客户端可能会初始化创建的对象两次,可能会在正确初始化之前将对象传递给其他函数等。

目前对象中有一个额外的标志,用于标记互斥量是否已初始化,我想知道是否真的有必要。

查看用于静态互斥初始化的宏 PTHREAD_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;
}

有时会死锁,有时会打印正常。 .....

最佳答案

不,你无法检测到。 EINVAL 可能会为未初始化的互斥体返回,但不一定。

此外 POSIX 规定:

Attempting to initialize an already initialized mutex results in undefined behavior.

所以你不应该那样做。

最好的方法是完全避免这种情况并正确初始化变量。这应该通过宏 PTHREAD_MUTEX_INITIALIZER 完成。

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

关于检查 pthread_mutex 是否初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com