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#
原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/13857865.html