欢迎访问wabc.cc — 源码交易 · 软件定制 · 建站服务一站式平台
全部分类
首页 - 首页 - 解决方案 - 推荐文章 - 多线程实现多任务二

多线程实现多任务二

分类:推荐文章 · 发布:2025-12-20 · 浏览:1

 线程的常用函数

4)回收线程资源

所需头文件:

#include

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

 

功能:

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

参数:

thread:被等待的线程号。

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

返回值:

成功:0

失败:非 0

示例代码如下:

#include   

#include   

#include   

  

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;  

}  

运行结果如下:

多线程2-------1.png

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

 

所需头文件:

#include

int pthread_detach(pthread_t thread);

 

功能:

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

参数:

thread:线程号。

返回值:

成功:0

失败:非 0

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

示例代码如下:

#include   

#include   

#include   

  

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;  

}  

 

运行结果如下:

多线程2-----------2.png

 

5)线程退出

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

所需头文件:

 

#include

void pthread_exit(void *retval);

 

功能:

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

参数:

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

返回值:

示例代码如下:

#include   

#include   

#include   

  

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;  

}  

 

运行结果如下:

多线程2--------3.png

 

 


上一篇:入驻萌推的保证金多少?萌推入驻费用需要多少?
下一篇:AIL智能链系统开发

相关文章

源码分类

热门源码

最新资讯

联系我们