pthread_mutex_lock返回无效参数。

8

我正在处理一些C代码,在锁定互斥锁时遇到了问题。该代码调用了一个函数,并在该函数中锁定一个互斥锁,以确保文件指针不会被覆盖。对于多个实例,大约有10-20次单独调用该函数,这样做是有效的,但在下一次调用时,pthread_mutex_lock将返回22的结果。然后,我将此结果输入strerror(); 并得到无效的参数。

无效的参数是什么意思?感谢您提供的任何帮助。

2个回答

9

22是一个错误代码,ENVAL,意味着参数无效。请确保您已经初始化了互斥锁,或者在某个地方取消了初始化。

此外,man pthread_mutex_lock说:

EINVAL

使用PTHREAD_PRIO_PROTECT协议属性创建的互斥锁,当前调用线程的优先级高于互斥锁的当前优先级上限。

我不太理解这个,但它可能意味着您需要更改线程的优先级。我不确定。也许其他人可以解释清楚。


4
有没有方法可以找出互斥锁是否已被反初始化?目前我正在打印内存地址,它总是返回相同的值,所以我认为它没有被反初始化。它肯定是一开始初始化的,因为前几次运行都很正常。 - Boardy

5
听起来你的程序有线程问题或是其他地方出现了问题。尝试打印互斥指针的值。让另一个线程简单地锁定互斥对象,然后将时间和锁定成功的信息打印到日志文件中,最后解锁互斥对象。我怀疑问题不在你正在查找的地方。
此外,正如其他人在这里所说,你最好创建一个非常小的测试程序来演示问题,并在这里发布它。很可能你无法让这个小程序演示出错误。然后,慢慢将所有原始代码添加到小程序中,直到错误返回。如果它返回了,那么你现在知道是什么导致了这个问题。如果它没有返回,你就完成了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接