欢迎来到天天文库
浏览记录
ID:27680462
大小:107.00 KB
页数:9页
时间:2018-12-03
《linux系统下的多线程遵循posix线程接口》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Limix系统下的多线程遵循POSIX线程接口,称为pthread。编写Lhwx下的多线程程序,需要使用头文件plhread.h,连接时需要使用库libplhread.a。顺便说一下,Linux卜‘pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序example].c。/*example.c*/#include2、o.h>#include〈pthread.h〉voidthread(void){inti;for(i=0;i<3;i++)printf(’’ThisisapthreadAn");>intmain(void){pthread_tid;inti,ret;ret=pthread_create(&id,NULL,(void*)thread,NULL);if(ret!=O){printf("Createpthreaderror!H);exit(1);>for(i=0;i<3;i++)printf(’’3、Thisisthemainprocess.Xn");pthreadJoin(id,NULL);return(0);>我们编译此程序:gccexamplel.c-lpthread-oexample1运行example1,我们得到如K结果:Thisisthemainprocess.Thisisapthread.Thisisthemainprocess.Thisisthemainprocess.Thisisapthread.Thisisapthread.再次运行,我们可能得到如下结果:Thisisap4、thread.Thisisthemainprocess.Thisisapthread.Thisisthemainprocess.Thisisapthread.Thisisthemainprocess.前后两次结果不一样,这是两个线程争夺CPU资源的结果。上面的示例中,我们使用到了两个函数,pthread_create和pthreadjoin,并声明了一个pthread_t型的变量。pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:typedefun5、signedlongintpthread_t;它是一个线程的标识符。函数pthreacLcreate用来创建一个线程,它的原型为:externintpthread_create_P((pthread_t*_thread,_constpthread_attr_t*_attr,void*(*_start_routine)(void*),void*_arg));第一个参数为f旨向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的6、函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时,函数返冋0,若不为0则说明创建线程失败,常见的错误返M代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行T一行代码。函数pthreadjoin用来等待一个线程的结束。函数原型为7、:externintpthreadjoin_P((pthread_t_th,void**_thread_return));第一个参数为被等待的线程标识符,第二个参数_为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回吋,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthreacLexit来实现。它的函数原型为:ext8、ernvoidpthread_exit一P((void*_retval))_attribute一((_noreturn_));唯一的参数是函数的返回代码,只要pthreadjoin中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程>能被多个线程等待,否则第一个接收到信号线程成功返回,其余调用pthreadjoin的线程则返回错误代码ESRCH。在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_c
2、o.h>#include〈pthread.h〉voidthread(void){inti;for(i=0;i<3;i++)printf(’’ThisisapthreadAn");>intmain(void){pthread_tid;inti,ret;ret=pthread_create(&id,NULL,(void*)thread,NULL);if(ret!=O){printf("Createpthreaderror!H);exit(1);>for(i=0;i<3;i++)printf(’’
3、Thisisthemainprocess.Xn");pthreadJoin(id,NULL);return(0);>我们编译此程序:gccexamplel.c-lpthread-oexample1运行example1,我们得到如K结果:Thisisthemainprocess.Thisisapthread.Thisisthemainprocess.Thisisthemainprocess.Thisisapthread.Thisisapthread.再次运行,我们可能得到如下结果:Thisisap
4、thread.Thisisthemainprocess.Thisisapthread.Thisisthemainprocess.Thisisapthread.Thisisthemainprocess.前后两次结果不一样,这是两个线程争夺CPU资源的结果。上面的示例中,我们使用到了两个函数,pthread_create和pthreadjoin,并声明了一个pthread_t型的变量。pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:typedefun
5、signedlongintpthread_t;它是一个线程的标识符。函数pthreacLcreate用来创建一个线程,它的原型为:externintpthread_create_P((pthread_t*_thread,_constpthread_attr_t*_attr,void*(*_start_routine)(void*),void*_arg));第一个参数为f旨向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的
6、函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时,函数返冋0,若不为0则说明创建线程失败,常见的错误返M代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行T一行代码。函数pthreadjoin用来等待一个线程的结束。函数原型为
7、:externintpthreadjoin_P((pthread_t_th,void**_thread_return));第一个参数为被等待的线程标识符,第二个参数_为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回吋,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthreacLexit来实现。它的函数原型为:ext
8、ernvoidpthread_exit一P((void*_retval))_attribute一((_noreturn_));唯一的参数是函数的返回代码,只要pthreadjoin中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程>能被多个线程等待,否则第一个接收到信号线程成功返回,其余调用pthreadjoin的线程则返回错误代码ESRCH。在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_c
此文档下载收益归作者所有