单个线程可通过以下三种方式退出,在不终止整个进程的情况下停止它的控制流。
1、线程只是从启动例程中返回,返回值是线程的退出码。
2、线程可以被同一进程中的其他线程取消 。
3、线程调用pthread_exit退出。
(一)线程退出
#include <pthread.h>
void pthread_exit(void *value_ptr);
进程中的其他线程可以通过调用pthread_join函数访问到value_ptr这个指针。
int pthread_join(pthread_t thread, void **value_ptr);
返回值:若成功则返回0,否则返回错误码
调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程返回或者被取消。
可以通过调用pthread_join函数将等待指定的线程终止。
(二)实例
#include <pthread.h>
#include "apue.h"
void* thr_fn1(void* arg)
{
printf("thread 1 returning !\n");
return((void*)1);
}
void* thr_fn2(void* arg)
{
printf("thread 2 exiting !\n");
pthread_exit((void*)2);
}
int main(int argc, char *argv[])
{
int err;
pthread_t tid1, tid2;
void *tret;
err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if(err != 0)
fprintf(stderr, "can't create thread 1: %s\n", strerror(err));
err = pthread_create(&tid2, NULL, thr_fn2, NULL);
if(err != 0)
fprintf(stderr, "can't create thread2: %s\n", strerror(err));
err = pthread_join(tid1, &tret);
if(0 != err)
fprintf(stderr, "can't join with thread1: %s\n", strerror(err));
printf("thread1 exit code %d\n", (int)tret);
err = pthread_join(tid2, &tret);
if(0 != err)
fprintf(stderr, "can't join with thread2: %s\n", strerror(err));
printf("thread2 exit code %d\n", (int)tret);
exit(0);
}
运行两次结果:
root@ubuntu:/mnt/hgfs/linux/multi_thread# ./win
thread 1 returning !
thread1 exit code 1
thread 2 exiting !
thread2 exit code 2
root@ubuntu:/mnt/hgfs/linux/multi_thread# ./win
thread 2 exiting !
thread 1 returning !
thread1 exit code 1
thread2 exit code 2
【分析】从运行结果可以看出,线程创建时,并不能保证哪个线程先运行。由执行流程可知,有可能线程1刚创建还未来得及执行时,控制权又被分配给了主线程,主线程在创建线程2时,然后执行完线程2之后,再调用线程1。之后运行结果如结果2所示。
【补充】如果将例子中的void* thr_fn1(void* arg)返回语句改成如下:
void* thr_fn1(void* arg)
{
printf("thread 1 returning !\n");
//return((void*)1);
exit(0);
}
则运行结果如下:
root@ubuntu:/mnt/hgfs/linux/multi_thread# ./win
thread 2 exiting !
thread 1 returning !
由于线程调用exit,则直接终止进程。