多线程编程(四)——线程终止

    如果进程中的任一线程调用了exit, _Exit或_exit,则整个进程就会终止。另外,如果信号的默认动作也是终止进程,那么把该信号发送到线程也会终止整个进程。
    单个线程可通过以下三种方式退出,在不终止整个进程的情况下停止它的控制流。
    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,则直接终止进程。


转载于:https://my.oschina.net/mavericsoung/blog/158182

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值