zoukankan      html  css  js  c++  java
  • Linux用户态线程pthread简单应用

     

    1、pthread_exit函数

    void pthread_exit( void * value_ptr );
    线程的终止可以是调用pthread_exit手动结束或者该线程的例程运行完成自动结束。
    也就是说,一个线程可以隐式的退出,也可以显式的调用pthread_exit函数来退出。 pthread_exit函数唯一的参数value_ptr是函数的返回代码,只要pthread_join中的第二个参数value_ptr不是NULL,这个值将被传递给value_ptr。
    使用函数pthread_exit退出线程,这是线程的主动行为;
    由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,
    但是可以用pthread_join()函数来同步并释放资源。
     
    retval:pthread_exit()调用线程的返回值,可由其他函数如pthread_join来检索获取。

     

    2、pthread_join函数

    int pthread_join( pthread_t thread, void * * value_ptr ); 函数pthread_join的作用是,等待一个线程终止。 
    调用pthread_join的线程,将被挂起,直到参数thread所代表的线程终止时为止。
    pthread_join是一个线程阻塞函数,调用它的函数将一直等到被等待的线程结束为止。 如果value_ptr不为NULL,那么线程thread的返回值存储在该指针指向的位置。
    该返回值可以是由pthread_exit给出的值,或者该线程被取消而返回PTHREAD_CANCELED。

    3、pthread_exit函数在main函数中的用法

    1)在main线程终止时如果调用了pthread_exit(),那么此时终止的只是main线程,
    而进程的资源会为其他由main线程创建的线程保持打开的状态,直到其他线程都终止。
    而在其他的由main线程创建的线程中pthread_exit并没有这种作用。

    2)在主线程中,在main函数中return了或是调用了exit函数,则主线程退出,且整个进程也会终止,
    此时进程中的所有线程也将终止。因此要避免main函数过早结束。
    3)在任何一个线程中调用exit函数都会导致进程结束。进程一旦结束,那么进程中的所有线程都将结束。

    4、pthread_create函数

    int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void*),void *arg);

    参数

    第一个参数为指向线程标识符指针
    第二个参数用来设置线程属性。
    第三个参数是线程运行函数的起始地址。
    最后一个参数是运行函数的参数。
    
    

    5、pthread_self函数获取线程ID

         pthread_t pthread_self();     

    例子:
    /*thread.c*/
    #include <stdio.h>
    #include <pthread.h>
     
    /*线程一*/
    void thread_1(void)
    {
        int i=0;
        for(i=0;i<=1000;i++)
        {
            printf("This is a pthread1.
    ");
            if(i==500)
                pthread_exit(0);//用pthread_exit()来调用线程的返回值,用来退出线程,但是退出线程所占用的资源不会随着线程的终止而得到释放
            sleep(1);
        }
    }
     
    /*线程二*/
    void thread_2(void)
    {
        int i;
        for(i=0;i<300;i++)
            printf("This is a pthread2.
    ");         
        pthread_exit(0);//用pthread_exit()来调用线程的返回值,用来退出线程,但是退出线程所占用的资源不会随着线程的终止而得到释放
    }
     
    int main(void)
    {
        pthread_t id_1,id_2;
        int i,ret;
    /*创建线程一*/
        ret=pthread_create(&id_1,NULL,(void  *) thread_1,NULL);
        if(ret!=0)
        {
            printf("Create pthread1 error!
    ");
        return -1;
        }
    /*创建线程二*/
        ret=pthread_create(&id_2,NULL,(void  *) thread_2,NULL);
        if(ret!=0)
        {
            printf("Create pthread2 error!
    ");
        return -1;
        }
    /*等待线程结束*/
        pthread_join(id_1,NULL);
        pthread_join(id_2,NULL);
        return 0;
    }
    
    
    备注:pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在线程函数在编译时,需要连接库函数。
    makefile添加:gcc create.c -o pthreadapp -lpthread


    参考引用:
    https://blog.csdn.net/youbang321/article/details/7816016#
  • 相关阅读:
    针对Python基本数据类型的操作
    Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from 这类问题的解决方法
    校招有感:计算机专业毕业生如何找工作(Java方向)
    我用了半年的时间,把python学到了能出书的程度
    Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
    Java字节码与反射机制
    以我的亲身经历,聊聊学python的流程,同时推荐学python的书
    面试时通过volatile关键字,全面展示线程内存模型的能力
    如果很好说出finalize用法,面试官会认为你很资深
    C# post json和接收json
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/13857865.html
Copyright © 2011-2022 走看看