pthread_mutex_lock_full断言失败错误
pthread_mutex_lock_full assertion failed error
我一直在编写 pthread 应用程序。应用程序具有由父线程跨线程共享的互斥锁。由于某种原因,它抛出以下错误:
../nptl/pthread_mutex_lock.c:428: __pthread_mutex_lock_full: Assertion `e != ESRCH || !robust' failed.
该应用程序用于使用基于 packet_mmap
的方法捕获高速网络流量,其中有多个线程,每个线程与一个套接字相关联。我不确定为什么会这样。它发生在测试期间,我无法始终重现错误。我在谷歌上搜索了很多,但我不知道原因。感谢您的帮助。
错误原因是文件读取。注释读取文件的行时,不会发生错误。它发生在这一行:
fread(this->bit_array, sizeof(int), this->m , fp);
其中 bit_array
是动态分配的整数数组,m
是数组的大小。
谢谢。
根据 this copy of GLIBC's pthread_mutex_lock.c
:
/* ESRCH can happen only for non-robust PI mutexes where
the owner of the lock died. */
assert (INTERNAL_SYSCALL_ERRNO (e, __err) != ESRCH || !robust);
您的 threads/processes 之一在未释放其所有锁定资源的情况下结束,或者您正在使用 pthread_cancel()
/kill()
并在线程或进程 运行.
在 GLIBC 2.31 中,您是 运行 pthread_mutex_lock()
的以下源代码:
oldval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
newval, 0);
if (oldval != 0)
{
/* The mutex is locked. The kernel will now take care of
everything. */
int private = (robust
? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
: PTHREAD_MUTEX_PSHARED (mutex));
int e = futex_lock_pi ((unsigned int *) &mutex->__data.__lock,
NULL, private);
if (e == ESRCH || e == EDEADLK)
{
assert (e != EDEADLK
|| (kind != PTHREAD_MUTEX_ERRORCHECK_NP
&& kind != PTHREAD_MUTEX_RECURSIVE_NP));
/* ESRCH can happen only for non-robust PI mutexes where
the owner of the lock died. */
assert (e != ESRCH || !robust);
/* Delay the thread indefinitely. */
while (1)
lll_timedwait (&(int){0}, 0, 0 /* ignored */, NULL,
private);
}
oldval = mutex->__data.__lock;
assert (robust || (oldval & FUTEX_OWNER_DIED) == 0);
}
在上面的代码中,互斥量的当前值是自动读取的,它看起来不同于 0 意味着互斥量被锁定。
然后,断言被触发,因为互斥锁的所有者死亡并且互斥锁不是一个健壮的互斥锁(意味着互斥锁没有在所有者线程结束时自动释放)。
如果您可以修改源代码,您可能需要为互斥锁(pthread_mutexattr_setrobust())添加“robust”属性,以便系统在所有者死亡时自动释放它。但它很容易出错,因为相应的关键代码部分可能尚未达到正常点,因此可能会留下一些未完成的工作...
所以,最好找出线程可能在不解锁互斥锁的情况下死亡的原因。要么是错误,要么是你忘记释放终止分支中的互斥量
我一直在编写 pthread 应用程序。应用程序具有由父线程跨线程共享的互斥锁。由于某种原因,它抛出以下错误:
../nptl/pthread_mutex_lock.c:428: __pthread_mutex_lock_full: Assertion `e != ESRCH || !robust' failed.
该应用程序用于使用基于 packet_mmap
的方法捕获高速网络流量,其中有多个线程,每个线程与一个套接字相关联。我不确定为什么会这样。它发生在测试期间,我无法始终重现错误。我在谷歌上搜索了很多,但我不知道原因。感谢您的帮助。
错误原因是文件读取。注释读取文件的行时,不会发生错误。它发生在这一行:
fread(this->bit_array, sizeof(int), this->m , fp);
其中 bit_array
是动态分配的整数数组,m
是数组的大小。
谢谢。
根据 this copy of GLIBC's pthread_mutex_lock.c
:
/* ESRCH can happen only for non-robust PI mutexes where
the owner of the lock died. */
assert (INTERNAL_SYSCALL_ERRNO (e, __err) != ESRCH || !robust);
您的 threads/processes 之一在未释放其所有锁定资源的情况下结束,或者您正在使用 pthread_cancel()
/kill()
并在线程或进程 运行.
在 GLIBC 2.31 中,您是 运行 pthread_mutex_lock()
的以下源代码:
oldval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
newval, 0);
if (oldval != 0)
{
/* The mutex is locked. The kernel will now take care of
everything. */
int private = (robust
? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
: PTHREAD_MUTEX_PSHARED (mutex));
int e = futex_lock_pi ((unsigned int *) &mutex->__data.__lock,
NULL, private);
if (e == ESRCH || e == EDEADLK)
{
assert (e != EDEADLK
|| (kind != PTHREAD_MUTEX_ERRORCHECK_NP
&& kind != PTHREAD_MUTEX_RECURSIVE_NP));
/* ESRCH can happen only for non-robust PI mutexes where
the owner of the lock died. */
assert (e != ESRCH || !robust);
/* Delay the thread indefinitely. */
while (1)
lll_timedwait (&(int){0}, 0, 0 /* ignored */, NULL,
private);
}
oldval = mutex->__data.__lock;
assert (robust || (oldval & FUTEX_OWNER_DIED) == 0);
}
在上面的代码中,互斥量的当前值是自动读取的,它看起来不同于 0 意味着互斥量被锁定。 然后,断言被触发,因为互斥锁的所有者死亡并且互斥锁不是一个健壮的互斥锁(意味着互斥锁没有在所有者线程结束时自动释放)。
如果您可以修改源代码,您可能需要为互斥锁(pthread_mutexattr_setrobust())添加“robust”属性,以便系统在所有者死亡时自动释放它。但它很容易出错,因为相应的关键代码部分可能尚未达到正常点,因此可能会留下一些未完成的工作...
所以,最好找出线程可能在不解锁互斥锁的情况下死亡的原因。要么是错误,要么是你忘记释放终止分支中的互斥量