This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM5728:pthread_cond_timedwait()挂起

Guru**** 2551110 points
Other Parts Discussed in Thread: AM5728

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/592390/linux-am5728-pthread_cond_timedwait-hang

器件型号:AM5728

工具/软件:Linux

我有一些代码在其他 ARMv7和 ARMv5系统上运行、但正在运行到 AM5728上的 pthread_cond_timedwait()中。 我在下面提供了一些相关的背景、示例代码、GDB 输出和 strace 输出。

背景:

  • 处理器 SDK 03.03.00.04
  • 处理器 SDK 中的 Linux 4.4.41
  • 来自 ELDK 5.8的编译器/libc

代码片段(开源 POCO C++库):


挂断位于 pthread_cond_timedwait()调用中:

bool EventImpl::waitImpl (长毫秒)
{
int rc = 0;
struct timespec absTime;
struct timestal tv;
gettimeofday (&tv、NULL);
abstime.tv_sec = tV.tv_sec +毫秒/ 1000;
abstime.tv_nsec = tV.tv_usec* 1000 +(毫秒% 1000)* 1000000;
if (abstime.tv_nsec >= 1000000000)
{
abstime.tv_tv_nsec = 1000000000;
abstime.tv_sec+
;}abstex (abse_tex





rc)


(if)= tex allock (if)(altex)(altex tex tex tex)(if)、tex tex (allock)(alt)(abtex tex tex tex tex tex tex (allock)(alt)(altex tex tex tex tex tex tex tex (alt)、tex tex tex tex tex (allock)
抛出 SystemException (“无法等待事件”);
}

如果(RC =0 &&_auto)_state = false;
pthread_mutex_unlock (&& mutex);
返回 RC =0;
} 

Gdb Snippet:


从下面的片段中、您可以推断:

  1. 通过上面的示例代码成功获得了互斥量(否则我们将无法获得 pthread_cond_timedwait()调用),然后传递给 pthread_cond_timedwait()
  2. 如文档所述(man 3 pthread_cond_timedwait)、pthread_cond_timedwait ()然后自动释放互斥量(您可以看到__lock 为0)并导致调用线程在条件变量上被阻止

(gdb) bt
_pthread_cond_timedwait 中的#0 b5f56398 (条件= ,互斥= ,abstime=bbx442ecec),位于 pthread_cond_timedwait.c:198
1 poco 中的0xb6543294:EventImpl:::waitImpl (此= 0x798f2e8、毫秒= 998)、位于 src/Event_POSIX.CPP:105
2 #2 0x01654088在 Poco 中::Event::tryWait (此= 0x798f2e8、毫秒= 998)、位于 open_source/poco/oco-2015.1-cscb/include/poco/Event.h:112

(gdb)帧2
#2 0x01654088 (在 Poco 中):事件::tryWait (此= 0x798f2e8、毫秒= 998)、位于 open_source/oco/oco-2015-cscb/include/poco/Event.h:112
返回 waitImpl (毫秒);
(gdb)打印*此
$47 ={
={
_auto = true、
_state = false、
mutex ={
_data ={
_lock = 0、
_count = 0、
_owner = 0、
_kind = 0、
_nusers = 1、
{
_INVINESS_0、
_list ={
__NEXT = 0x0
}
}
}、
_size ='\000' ,“\001\000\000\000\000\000\000\000”,
_align = 0
}、
_COND ={
_data ={
_lock = 0、
__futex = 29,
__TOTAL_SEQ = 15,
_WAKEUP_SEQ = 14、
_ASH_SEQ = 14、
_mutex = 0x798f2ec、
_n侍 者= 2、
_broadcast_Seq = 9
}、
_size ="\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\354\362\23a\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
_align = 124554051584
}
}、 }

strace 片段片段:

下面的线程1033与上面的 GDB 回溯线程相同。 在 futex 系统调用之后、线程1033不再有任何活动。 您可以看到、futex 值29与上述 Poco::Event 中包含的 pthread 条件变量的值相匹配。  

1033 clock_gettime (clock_monotonic、{7567、448404485})= 0
1033 gettimeofday ({1493658053、414445}、NULL)= 0
1033 futex (0x798f30c、FUTEX_WAITSET_PRIVE|FUTEX_CLOCK _REALTIME、29、{1493658054、412445000}、 FFFFFFFF

执行此代码的自定义应用程序每次运行时都不会在 pthread_cond_timedwait()中挂起-某些运行将在应用程序被终止前30分钟以上。 另一方面,应用程序有时在 pthread_cond_timedwait()挂起前不会运行超过5-10秒。

我们非常感谢您提供任何指针/调试提示。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    显然,它等待着这一事件。 您能否确认该事件实际发生了?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Clemens Ladisca]显然、它会等待事件发生。 您能否确认该事件实际发生了?

    [/报价]
    您是否提到了正在发出信号的条件变量? 我不确定如何确认(内核通过 futex)正在向条件变量发出这样的定时等待信号。 由于 futex 系统调用挂起、我假设事件没有发生。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    内核、POCO 库或应用程序中存在错误。 我估计最后一种情况最有可能发生。

    您是否实际了解该应用? 如果您查看的是系统调用、我怀疑您没有、并且您没有源代码。 在这种情况下,很难确定应用程序是否调用 Event.set()。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Clemens Ladiscy]内核、POCO 库或应用程序中都有错误。 我估计最后一种情况最有可能发生。

    您是否实际了解该应用? 如果您查看的是系统调用、我怀疑您没有、并且您没有源代码。 在这种情况下,很难确定应用程序是否调用 Event.set()。

    [/报价]
    是的、我知道应用程序。 应用程序不需要调用 Event.set()-由于调用了 pthread_cond_timedwait(),因此在达到指定的绝对时间时,它应返回 ETIMEDOUT。 这不是发生的。 pthread_cond_timedwait()函数永远不会返回-使用 ETIMEDOUT 或其他方式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确、它最终应该超时。

    这看起来像是一个内核错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这对我来说仍然是一个关键问题。 对 pthread_cond_timedwait()的调用,如果在发出条件信号后或指定的绝对时间过了,则会定期返回失败。

    是否有任何关于我为什么会遇到这一明显的内核级问题的见解?  

    我没有使用 AM5728的内置 RTC 来实现它的价值。

    谢谢