在调试项目代码的时候,发现总是会出现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
阅读(1977) | 评论(0) | 转发(0) |