线程等待与分离

  • 线程等待

需要线程等待的原因:

1.已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。

2.创建新的线程不会复用刚才退出线程的地址空间。

pthread_join函数:

函数原型:int   pthread_join(pthread_t   thread,void   **value_ptr);

功能:等待线程结束。

参数:thread,线程ID。

返回值:成功返回0;失败返回错误码。

调用该函数的线程将挂起等待,直到ID为thread的线程终止。

thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的。总结如下:

1.若thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值。

2.若thread线程被别的线程调用pthread_cancel异常终止,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED。

3.若thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。

4.若对thread线程的终止状态不感兴趣,可以传NULL给value_ptr参数。

代码实例:

#include 
#include
#include
#include
#include

void *thread1(void *arg){
    printf("thread 1 returning ... \n");
    int *p = (int *)malloc(sizeof(int));
    *p = 1;
    return (void*)p;
}

void *thread2(void *arg){
    printf("thread 2 exiting ... \n");
    int *p = (int *)malloc(sizeof(int));
    *p = 2;
    pthread_exit((void*)p); 
}

void *thread3(void *arg){
    while(1){
        printf("thread 3 is running ...\n");
        sleep(1);
    }
    return;
}

int main(){
    pthread_t tid;
    void *ret;

    pthread_create(&tid,NULL,thread1,NULL);
    pthread_join(tid,&ret);
    printf("thread return,thread id %X,return code:%d\n",tid,*(int*)ret);
    free(ret);

    pthread_create(&tid,NULL,thread2,NULL);                                                                                                                                             
    pthread_join(tid,&ret);                                                                                                                                                             
    printf("thread return,thread id %X,return code:%d\n",tid,*(int*)ret);                                                                                  
    free(ret);   

    pthread_create(&tid,NULL,thread3,NULL);
    sleep(3);                             
    pthread_cancel(tid);
    pthread_join(tid,&ret);
    if(ret == PTHREAD_CANCELED)                             
        printf("thread return,thread id %X,return code:PTHREAD_CANCELED\n",tid);                                                                                  
    else
        printf("thread return,thread id %X,return code:NULL\n",tid); 
}

结果演示:

线程等待与分离_第1张图片

  • 分离线程    

默认情况下,新创建的线程是joinable(可结合)的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统的内存泄漏。

如果不关心线程的返回值,join就是一种负担。这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源,可以应用pthread_detach函数。

函数原型:int  pthread_detach(pthread_t   thread);

可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离:pthread_detach(pthread_self());

joinable和分离是冲突的,一个线程不能既是joinable又是分离的。

注意:一个分离的线程出现异常,这个线程所在的进程也会异常退出。因为不管线程分离与否,线程始终运行在进程的地址空间中。

代码实例:

#include 
#include
#include
#include
#include

void *thread_run(void *arg){
    pthread_detach(pthread_self());
    printf("%s\n",(char*)arg);
    return;
}

int main(){
    pthread_t tid;
    if(pthread_create(&tid,NULL,thread_run,"thread1 run...") != 0){
        printf("create thread error\n");
        return 1;
    }

    int ret = 0;
    sleep(1);

    if(pthread_join(tid,NULL) == 0){
        printf("pthread wait success\n");
        ret = 0;
    }
    else{
        printf("pthread wait failed\n");
        ret = 1;
    }
    return ret;
}

结果演示:



你可能感兴趣的:(知识点小结,Linux)