在调试项目代码的时候,发现总是会出现Segment Fault,跟踪了一下,发现是pthread_cancel()导致的,这是由于Linux的Native POSIX Thread Library的实现,有一个race condition,表现出来的现象是,对一个正要结束的线程调用pthread_cancel()的时候,会随机的收到SIGSEGV。这个问题在 UNIX各个版本,如Solaris,HP-UX,AIX上面都没有。 换一个思路,通过pthread_kill来测试线程是否存在,然后再进行相应的动作,这样应该可以避免出现向正在结束的线程调用pthread_cancel()。但是pthread_kill()也出现了SIGSEGV,真是ft,也是一样的原因。 解决方法: 1、使用pthread_mutex和pthread_cond系列函数进行同步,避免Linux NPTL中的这个race condition。 2、增加一个状态机制,用一个全局的表来存储每个线程的状态,当线程结束的时候,将表中相应的状态从RUNNING置为DEAD;主线程不断的check那个状态表就可以了,有些dirty;-) 参考: http://blog.chinaunix.net/u/13667/showart_222280.html http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-04/0632.html http://www.9php.com/FAQ/cxsjl/c/2008/01/6564294109336.html |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-29 21:20 , Processed in 0.179971 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.