pthread_cond_timedwait返回错误454(freebsd)

时间:2014-05-29 00:52:59

标签: pthreads return-value freebsd errno condition-variable

我无法在Google上找到有关此错误的任何信息,因此我在此发帖以查看是否有人知道。

基本上,我的代码有一个看起来像这样的代码片段:

int rc = pthread_cond_timedwait(&cond, &mutex, &ts);
if ( (0 != rc) && (ETIMEDOUT != rc)) {
  assert(false); // This should not happen.
}

有时,我的程序会崩溃,核心文件会显示rc = 454。 454不映射到errno.h中的任何错误代码。另外,查看pthread_cond_timedwait()可以给出的可能返回值列表,它们都不像454。

我已经查看了传入的参数,但我真的不知道如何解释这些参数或者我可以在哪里学习。

(gdb) p *mutex
$20 = {m_lock = {m_owner = 100179, m_flags = 0, m_ceilings = {0, 0}, m_spare = {0, 0, 0, 0}}, m_type = PTHREAD_MUTEX_ERRORCHECK, m_owner = 0x80a004c00, m_count = 0, m_refcount = 0, m_spinloops = 0, m_yieldloops = 0, m_qe = {tqe_next = 0x0, tqe_prev = 0x80a004f10}}
(gdb) p *cond
$21 = {c_lock = {m_owner = 0, m_flags = 0, m_ceilings = {0, 0}, m_spare = {0, 0, 0, 0}}, c_kerncv = {c_has_waiters = 1, c_flags = 0, c_spare = {0, 0}}, c_pshared = 0, c_clockid = 0}
(gdb) p ts
$22 = {tv_sec = 1400543215, tv_nsec = 0}

" cond"的内部结构看起来很可疑,但正如我所提到的,我无法确定。

1 个答案:

答案 0 :(得分:0)

因为它是FreeBSD,我们可以查看源代码,看看你从哪里获得神秘的454返回。使用fxr.watson.org上的源存档,我搜索了符号pthread_cond_timedwait,唯一可靠的引用是在GLIBC27代码中,所以我们将在那里查看。

在源文件pthread_cond_timewait.c中,我们看到函数__pthread_cond_timedwait。有三个回报;第一个是EINVAL,第二个是__pthread_mutex_unlock_usercnt的返回,第三个是__pthread_mutex_cond_lock的返回。既然我已经给你找到答案的工具了,你可以自己去追寻其余的答案。 454必须来自解锁或锁定呼叫之一。

源文件底部的versioned_symbol宏是本地__pthread_cond_timedwait调用全局pthread_cond_timedwait函数的原因。