函数原型: #include <pthread.h> 返回值:若是成功建立线程返回0,否则返回错误的编号 #include <pthread.h> 编译方法: #gcc -Wall -lpthread pthread_test.c 因为pthread的库不是linux系统的库,所以在进行编 译的时候要加上-lpthread,否则编译不过,会出现下面错误 thread_test.c: 在函
数 ‘create’ 中: 例题2 功能:向新的线程传递整形值 程序名称:pthread_int.c #include <stdio.h> 编译方法: gcc -lpthread thread_int.c -Wall 执行结果: create parameter is 4 例题总结: #include <pthread.h>
gcc -Wall thread_char.c -lpthread
arg is wang
#include <stdio.h>
gcc -Wall -lpthread thread_struct.c
test->a ==4 例题5 程序目的:验证新建立的线程可以共享进程中的数据 程序名称:thread_share.c #include <stdio.h>
gcc -Wall -lpthread thread_share.c
new pthread ... 例题总结:可以看出来,我们在主线程更改了我们的全局变量a的值的时候,我们新建立的线程则打印出来了改变的值,可以看出可以访问线程所在进程中的数据信 息。 如果进程中任何一个线程中调用exit,_Exit,或者是_exit,那么整个进程就 会终止,与此类似,如果信号的默认的动作是终止进程,那么,把该信号发送到线程会终止进程。 线程的正常退出的方式: (1) 线程只是从启动例程中返回,返回值是线程中的退出码 (2) 线程可以被另一个进程进行终止 (3) 线程自己调用pthread_exit函数 两个重要的函数原型: #include <pthread.h> 例题6 #include <stdio.h>
gcc -Wall exit_return.c -lpthread
new thread is created ...
#include <stdio.h>
gcc -Wall -lpthread exit_struct.c main ...
#include <pthread.h>
pthread_t pthread_self(void); 例题8 程序目的:实现在新建立的线程中打印该线程的id和进程id 程序名称:thread_self.c #include <stdio.h>
#include <pthread.h> #include <unistd.h> /**//*getpid()*/ void *create(void *arg) ...{ printf("new thread .... "); printf("thread_tid==%u ",(unsigned int)pthread_self()); printf("thread pid is %d ",getpid()); return (void *)0; } int main(int argc,char *argv[]) ...{ pthread_t tid; int error; printf("Main thread is starting ... "); error=pthread_create(&tid,NULL,create,NULL); if(error!=0) ...{ printf("thread is not created ... "); return -1; } printf("main pid is %d ",getpid()); sleep(1); return 0; } 编译方法: gcc -Wall -lpthread thread_self.c
执行结果: Main thread is starting ...
main pid is 6860 new thread .... thread_tid==3084954544 thread pid is 6860 4、 线程的处理程序函数原型: #include <pthread.h>
void pthread_cleanup_push(void (*rtn)(void *),void *arg); 函数rtn是清理函数,arg是调用参数 void pthread_cleanup_pop(int execute); 在前面讲过线程的终止方式,是正常终止还是非正常终止,都会存在一个资源释放的问题,在posix中提供了一组,就是我们上面看的函数进行线程退出的处理 函数,有些像在进程中的atexit函数。释放的方式是指pthread_cleanup_push的调用点到pthread_cleanup_pop之 间程序段进行终止。 pthread_cleanup_push()/pthread_cleanup_pop采用先入后出的方式的栈的管理方式,void *rtn(void *),在执行pthread_cleanup_push()时压入函数栈,多次执行pthread_cleanup_push()形成一个函数链,在执行 这个函数链的时候会以反方向弹出,即先入后出。execute参数表识,是否执行弹出清理函数,当execute=0时不进行弹出清理函数,非零的时候弹 出处理函数。例题9 程序目的:实现在正常结束线程的时候,进行函数处理 程序名称:thread_clean.c 编译方法: 执行结果: thread 1 start
thread 1 push complete thread 1 exit code 1 thread 2 start thread 2 push complete cleanup :thread 2 second handler cleanup :thread 2 first handler thread 2 exit code 2 gcc -Wall -lpthread thread_clean.c
#include <stdio.h>
#include <pthread.h> #include <unistd.h> void *clean(void *arg) ...{ printf("cleanup :%s ",(char *)arg); return (void *)0; } void *thr_fn1(void *arg) ...{ printf("thread 1 start "); pthread_cleanup_push(clean,"thread 1 first handler"); pthread_cleanup_push(clean,"thread 1 second hadler"); printf("thread 1 push complete "); if(arg) ...{ return((void *)1); } pthread_cleanup_pop(0); pthread_cleanup_pop(0); return (void *)1; } void *thr_fn2(void *arg) ...{ printf("thread 2 start "); pthread_cleanup_push(clean,"thread 2 first handler"); pthread_cleanup_push(clean,"thread 2 second handler"); printf("thread 2 push complete "); if(arg) ...{ pthread_exit((void *)2); } pthread_cleanup_pop(0); pthread_cleanup_pop(0); pthread_exit((void *)2); } int main(void) ...{ int err; pthread_t tid1,tid2; void *tret; err=pthread_create(&tid1,NULL,thr_fn1,(void *)1); if(err!=0) ...{ printf("error .... "); return -1; } err=pthread_create(&tid2,NULL,thr_fn2,(void *)1); if(err!=0) ...{ printf("error .... "); return -1; } err=pthread_join(tid1,&tret); if(err!=0) ...{ printf("error .... "); return -1; } printf("thread 1 exit code %d ",(int)tret); err=pthread_join(tid2,&tret); if(err!=0) ...{ printf("error .... "); return -1; } gcc -Wall -lpthread thread_clean.c
printf("thread 2 exit code %d ",(int)tret); exit(0); } |
|
来自: angelbrian > 《囧~Linux》