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”属性,以便系统在所有者死亡时自动释放它。但它很容易出错,因为相应的关键代码部分可能尚未达到正常点,因此可能会留下一些未完成的工作...

所以,最好找出线程可能在不解锁互斥锁的情况下死亡的原因。要么是错误,要么是你忘记释放终止分支中的互斥量