杀死一个线程的时候出现段错误,请教!!
下面的程序,当线程执行了一次超时处理之后杀死它会出现段错误,弄不明白,
是什么
#include <stdio.h>
#include <sys/time.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *unlock_mutex(void *arg)
{
//pthread_mutex_t *temp = (pthread_mutex_t *)arg;
pthread_mutex_unlock(&mutex);
}
void *thread_func(void *temp)
{
//pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
//pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
struct timespec abstime;
memset(&abstime, 0, sizeof(struct timespec));
abstime.tv_sec = time(NULL) + 4;
abstime.tv_nsec = 0;
pthread_mutex_lock(&mutex);
//pthread_cleanup_push(pthread_mutex_unlock, &mutex);
while(1)
{
//pthread_mutex_lock(&mutex);
//int ret = pthread_cond_wait(&cond, &mutex);
int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);
if(ret!=0)
{
printf("time out in threadn");
abstime.tv_sec = time(NULL) + 4;
// pthread_mutex_unlock(&mutex);
continue;
}
printf("cond successfuln");
}
//pthread_cleanup_pop(0);
pthread_mutex_unlock(&mutex);
}
int main()
{
pthread_t id;
pthread_create(&id, NULL,&thread_func, NULL);
//sleep(2);
//pthread_cond_signal(&cond);
sleep(6);
printf("return :%dn",pthread_cancel(id));
pthread_join(id, NULL);
//printf("hello!n");
//while(1){};
return 0;
}
gdb调试的时候提示段出错的位置在
#0 0x00000000 in ?? ()
#1 0x4003cd19 in __pthread_cleanup_upto () from /lib/tls/libpthread.so.0
#2 0x42027301 in _longjmp_unwind () from /lib/tls/libc.so.6
#3 0x4202726c in siglongjmp () from /lib/tls/libc.so.6
#4 0x40038ea4 in sigcancel_handler () from /lib/tls/libpthread.so.0
#5 <signal handler called>
#6 0xffffe002 in ?? ()
系统是REDHAT9
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
已经找的原因了,是红帽子9和POSIX线程库的问题,我在FC5上跑正常,只在redhat9上会出这样的问题.
你编译的时候是否加上了参数 -lpthread
我这里也是正常的
RHEL4
内核2.6.9-22
我这里运行正常,linux上.
无论加不加资源处理函数都是一样的结果,主要是在join的时候出现错误