工具/软件: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:
从下面的片段中、您可以推断:
- 通过上面的示例代码成功获得了互斥量(否则我们将无法获得 pthread_cond_timedwait()调用),然后传递给 pthread_cond_timedwait()
- 如文档所述(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秒。
我们非常感谢您提供任何指针/调试提示。
谢谢