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.\n"); 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.\n"); 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!\n"); return -1; } /*创建线程二*/ ret=pthread_create(&id_2,NULL,(void *) thread_2,NULL); if(ret!=0) { printf("Create pthread2 error!\n"); 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#