- 论坛徽章:
- 0
|
在我的项目中遇到了一个多线程的问题,为了简化问题,我写了个简单的例程来
说明,操作系统是Red hat 9,2.4.20的内核,我的例程如下:
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
void *thread_func(void *arg);
int main(){
pthread_t th;
int *exitcode,
pthread_create(&th,NULL,thread_func,NULL);
pthread_join(th,NULL);
printf("Child thread exit.");
return;
}
void *thread_func(void *arg){
struct timespec abstime;
struct timeval nowtime;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t PTHREAD_MUTEX_INITIALIZER;
gettimeofday(&nowtime,NULL);
abstime.tv_sec=nowtime.tv_sec+3;
abstime.tv_nsec=0;
printf("Child thread waiting...\n");
pthread_mutex_lock(&mutex);
pthread_cond_timedwait(&cond,&mutex,&abstime);
pthread_mutex_unlock(&mutex);
printf("Child thread after waiting 3 seconds.\n");
pthread_exit(NULL);
// return ((void *)1);
}
程序的功能是在主线程中产生一个子线程,子线程函数就是thread_func,
主线程产生子线程之后调用pthread_join来等待子线程的结束。而子线程的
功能就是利用pthread_cond_timedwait这个函数来等待3秒后用pthread_exit
退出。
至于这里为什么用了互斥锁和条件变量,以及用pthread_cond_timedwait
来等待,这是我项目中的问题简化,这里只是作为示例来说明。
将以上程序编译后:gcc -o test test.c -lpthread ,
然后运行 ./test
输出结果为:
Child thread waiting...
Child thread after waiting 3 seconds.
段错误
我的问题就是在子线程用pthread_exit退出后,产生了段错误。而使用return 退出 ,
就是我程序中注释掉的部分,这样的话,就不会有段错误。
同样,若是我把pthread_cond_timedwait这一行程序注释掉,程序也不会出错,
这是为什么呢?
我的结论是,子线程中,pthread_cond_timedwait和pthread_exit不能同时使用,但
这个解释太勉强了,不能说明真正原因。而且道理上子线程用pthread_exit和return
退出,都是一样的,但是为什么一个会产生段错误,而另一个却不会。 |
|