Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90057
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 11
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-23 00:16
文章分类
文章存档

2015年(13)

2014年(18)

我的朋友

分类: LINUX

2014-11-28 14:03:21

在调试项目代码的时候,发现总是会出现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) |
给主人留下些什么吧!~~