打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
多线程实现多任务二

线程的常用函数

4)回收线程资源

所需头文件:

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);

功能:

等待线程结束(此函数会阻塞),并回收线程资源,类似进程的 wait() 函数。如果线程已经结束,那么该函数会立即返回。

参数:

thread:被等待的线程号。

retval:用来存储线程退出状态的指针的地址。

返回值:

成功:0

失败:非 0

示例代码如下:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

void *thead(void *arg)  

{  

    static int num = 123; //静态变量  

    printf("after 2 seceonds, thread will return\n");  

    sleep(2);  

    return #  

}  

int main(int argc, char *argv[])  

{  

    pthread_t tid;  

    int ret = 0;  

    void *value = NULL;  

    // 创建线程  

    ret = pthread_create(&tid, NULL, thead, NULL);  

    if(ret != 0){ //创建失败  

        perror("pthread_create");  

    }  

    // 等待线程号为 tid 的线程,如果此线程结束就回收其资源  

    // &value保存线程退出的返回值  

    pthread_join(tid, &value);   

    printf("value = %d\n", *( (int *)value ) );  

    return 0;  

}  

运行结果如下:


创建一个线程后应回收其资源,但使用 pthread_join() 函数会使调用者阻塞,Linux 还提供了非阻塞函数 pthread_detach() 来回收线程的资源。

所需头文件:

#include <pthread.h>

int pthread_detach(pthread_t thread);

功能:

使调用线程与当前进程分离,分离后不代表此线程不依赖与当前进程,线程分离的目的是将线程资源的回收工作交由系统自动来完成,也就是说当被分离的线程结束之后,系统会自动回收它的资源。所以,此函数不会阻塞。

参数:

thread:线程号。

返回值:

成功:0

失败:非 0

注意,调用 pthread_detach() 后再调用 pthread_join() , pthread_join() 会立马返回,调用失败。

示例代码如下:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

void *thead(void *arg)  

{  

    int i;  

    for(i=0; i<5; i++)  

    {  

        printf("I am runing\n");  

        sleep(1);  

    }  

    return NULL;  

}  

int main(int argc, char *argv[])  

{  

    int ret  = 0;  

    pthread_t tid;  

    ret = pthread_create(&tid, NULL, thead, NULL);  

    if(ret!=0){  

        perror("pthread_create");  

    }  

    pthread_detach(tid); // 线程分离,不阻塞  

    // 立马返回,调用失败  

    int flag = pthread_join(tid, NULL);  

    if(flag != 0){  

        printf("join not working\n");  

    }  

    printf("after join\n");  

    sleep(3);  

    printf("I am leaving\n");  

    return 0;  

}  

运行结果如下:


5)线程退出

在进程中我们可以调用 exit() 函数或 _exit() 函数来结束进程,在一个线程中我们可以通过 pthread_exit() 在不终止整个进程的情况下停止它的控制流。

所需头文件:

#include <pthread.h>

void pthread_exit(void *retval);

功能:

退出调用线程。一个进程中的多个线程是共享该进程的数据段,因此,通常线程退出后所占用的资源并不会释放。

参数:

retval:存储线程退出状态的指针。

返回值:

示例代码如下:

#include <stdio.h>  

#include <unistd.h>  

#include <pthread.h>  

void *thread(void *arg)  

{  

    static int num = 123; //静态变量  

    int i = 0;  

    while(1)  

    {  

        printf("I am runing\n");  

        sleep(1);  

        i++;  

        if(i==3)  

        {  

            pthread_exit( (void *)&num );  

            // return #  

        }  

    }  

    return NULL;  

}  

int main(int argc, char *argv[])  

{  

    int ret  = 0;  

    pthread_t tid;  

    void *value  = NULL;  

    ret = pthread_create(&tid, NULL, thread, NULL);    

    if(ret!=0){  

        perror("pthread_create");  

    }  

    pthread_join(tid, &value);  

    printf("value = %d\n", *(int *)value );  

    return 0;  

}  

运行结果如下:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux?多线程编程(?POSIX?)(?一?)?1.基础线程创建:
##多线程的使用示例
pthread
linux 线程函数大全
C++中类成员函数作为回调函数
Posix线程编程指南
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服