Linux多线程编程入门.ppt

上传人:qwe****56 文档编号:70008255 上传时间:2023-01-14 格式:PPT 页数:14 大小:153KB
返回 下载 相关 举报
Linux多线程编程入门.ppt_第1页
第1页 / 共14页
Linux多线程编程入门.ppt_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《Linux多线程编程入门.ppt》由会员分享,可在线阅读,更多相关《Linux多线程编程入门.ppt(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、多核程序设计多核程序设计Linux 多线程编程多线程编程2008年4月中中山山大大学学多多核核技技术术实实验验室室POSIX 线程库线程库Pthreads介绍介绍pIEEEPOSIX标准p1003.1c(Pthreads)定义了处理线程的一系列C语言类型的API。p在Linux中,线程一般被认为是“轻量级的进程”。pLinux创建进程所使用的函数是fork()或者vfork()。而对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs。p使用fork()创建进程和使用POSIX线程库差别:n使用fork()创建进程的特点:p代价昂贵,通常子进程需要拷贝父进程的整个

2、上下文,比如数据等。p进程间的通信方式比较复杂,比如使用管道、消息、共享内存等方法。p操作系统在实现进程间的切换比线程切换更费时。n使用POSIXpthreads库创建线程的特点:p线程可使用存在于进程中的资源,因此创建进程比创建线程更快。p线程间的通信方式更容易,比如通过进程中的变量,可以让多个线程共享数据。p操作系统对线程的切换比对进程的切换更容易和快速。中中山山大大学学多多核核技技术术实实验验室室POSIX pthreads库库p线程的创建npthreads线程库中提供的创建线程的函数是pthread_create()#includeintpthread_create(pthread_t

3、*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);p线程的退出n在线程的处理函数中,可以显示的调用pthread_exit()结束线程执行,也可以不调用pthread_exit(),而只是让线程处理程序返回。n除了pthread_exit()函数,可以让当前调用pthread_exit()的线程显示地退出外,线程也可以使用pthread_cancel()函数终止其他线程的执行。中中山山大大学学多多核核技技术术实实验验室室POSIX pthreads库库(续续)p等待线程结束npthread_join()函数会挂

4、起创建线程的线程的执行,直到等待到想要等待的子线程。intpthread_join(pthread_tth,void*thread_return);p线程的分离n主线程创建子线程,且子线程本身自己有自我回收内存资源的能力。intpthread_detach(pthread_tth);p获得当前线程标志n使用pthread_self()函数可以获得当前线程的标志,pthread_self()的返回值就是当前线程的标志。pthread_tpthread_self(void);中中山山大大学学多多核核技技术术实实验验室室使用使用Pthreads编写的程序例子编写的程序例子#include#inclu

5、de#include#include#defineTHREAD_NUMBER2intretval_hello1=2,retval_hello2=3;void*hello1(void*arg)char*hello_str=(char*)arg;sleep(1);printf(%sn,hello_str);pthread_exit(&retval_hello1);void*hello2(void*arg)char*hello_str=(char*)arg;sleep(2);printf(%sn,hello_str);pthread_exit(&retval_hello2);中中山山大大学学多多核核

6、技技术术实实验验室室使用使用Pthreads编写的程序例子编写的程序例子(续续)intmain(intargc,char*argv)inti;intret_val;int*retval_hello2;pthread_tptTHREAD_NUMBER;constchar*argTHREAD_NUMBER;arg0=helloworldfromthread1;arg1=helloworldfromthread2;printf(Begintocreatethreads.n);ret_val=pthread_create(&pt0,NULL,hello1,(void*)arg0);if(ret_val

7、!=0)printf(pthread_createerror!n);exit(1);中中山山大大学学多多核核技技术术实实验验室室使用使用Pthreads编写的程序例子编写的程序例子(续续2)ret_val=pthread_create(&pt1,NULL,hello2,(void*)arg1);if(ret_val!=0)printf(pthread_createerror!n);exit(1);printf(Now,themainthreadreturns.n);printf(Begintowaitforthreads.n);for(i=0;iTHREAD_NUMBER;i+)ret_val

8、=pthread_join(pti,(void*)&retval_helloi);if(ret_val!=0)printf(pthread_joinerror!n);exit(1);elseprintf(returnvalueis%dn,*retval_helloi);return0;中中山山大大学学多多核核技技术术实实验验室室线程的属性线程的属性属性名属性名意意义 detachstate选择被创建的线程是处于可加入的状态还是分离状态。可加入状态值是PTHREAD_CREATE_JOINABLE;分离状态值是PTHREAD_CREATE_DETACHED。缺省状态值是PTHREAD_CREAT

9、E_JOINABLE。pthread_attr_setdetachstate()可设置线程为加入或者分离状态;pthread_attr_getdetachstate()可以获得当前线程是否是加入的或者是分离的状态。schedpolicy为被创建的线程选择调度策略。被创建的线程的状态可以是SCHED_OTHER(一般的,非实时调度)、SCHED_RR(实时,轮转调度)或者SCHED_FIFO(实时,先进先出调度)。缺省值是SCHED_OTHER。实时调度SCHED_RR 和 SCHED_FIFO 只能用于有超级用户权限的进程使用。pthread_attr_setschedpolicy()和 pt

10、hread_attr_getschedpolicy()函数可以设置和获得线程的调度属性。schedparam为被创建的线程选择调度参数。这里的调度参数指的是线程的调度优先级。缺省优先级是0。这个属性对于SCHED_OTHER是不重要的;它只对SCHED_RR和SCHED_FIFO两个和实时调度相关的调度方式有效。pthread_attr_setschedparam()和pthread_attr_getschedparam()两个函数可以分别对线程的优先级进行设置和获取。inheritsched选择对新创建的线程的调度策略和调度参数是否被schedpolicy 和schedparam 属性决定(

11、这时的值是PTHREAD_EXPLICIT_SCHED)或者是通过父线程继承而得到的(这时的值是PTHREAD_INHERIT_SCHED)。缺省的值是PTHREAD_EXPLICIT_SCHED。scope为选择被创建的线程调度竞争范围。缺省值是PTHREAD_SCOPE_SYSTEM,表示线程和系统的所有的其他运行在CPU上的进程争夺CPU资源。如果是PTHREAD_SCOPE_PROCESS,表示调度的竞争只发生在运行于同一进程空间的线程之间,线程的优先级只在同一进程空间的线程之间有效,和其他进程无关。中中山山大大学学多多核核技技术术实实验验室室线程互斥和同步线程互斥和同步Mutexp原

12、子性。对mutex的加锁和解锁操作是原子的,一个线程进行mutex操作的过程中,其他线程不能对同一个mutex进行其他操作。p单一性。拥有mutex的线程除非释放mutex,否则其他线程不能拥有此mutex。p非忙等待。等待mutex的线程处于等待状态,直到要等待的mutex处于未加锁状态,这时操作系统负责唤醒等待此mutex的线程。pPOSIX线程库对mutex提供了以下函数进行操作:intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*mutexattr);intpthread_mutex_lock(pth

13、read_mutex_t*mutex);intpthread_mutex_trylock(pthread_mutex_t*mutex);、intpthread_mutex_unlock(pthread_mutex_t*mutex);intpthread_mutex_destroy(pthread_mutex_t*mutex);中中山山大大学学多多核核技技术术实实验验室室线程互斥和同步线程互斥和同步条件变量条件变量p条件标量是线程的同步设备。在线程间使用条件变量可以使得一个线程在执行过程中,因满足某个条件而发出信号通知另一个线程;而另一个线程可以处于挂起状态,等待某个条件的满足后,才继续执行。p

14、条件变量必须和mutex一起使用来避免竞争情况。pthread_cond_tcond=PTHREAD_COND_INITIALIZER;intpthread_cond_init(pthread_cond_t*cond,pthread_condattr_t*cond_attr);intpthread_cond_signal(pthread_cond_t*cond);intpthread_cond_broadcast(pthread_cond_t*cond);intpthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t*mutex);intpth

15、read_cond_timedwait(pthread_cond_t*cond,pthread_mutex_t*mutex,conststructtimespec*abstime);intpthread_cond_destroy(pthread_cond_t*cond);中中山山大大学学多多核核技技术术实实验验室室线程的撤销线程的撤销p一个线程可以通过向另个线程发送“请求”来结束另一个线程的执行。pPOSIXpthreads库中关于撤销操作的函数有:nintpthread_setcancelstate(intstate,int*oldstate);nintpthread_setcancelty

16、pe(inttype,int*oldtype);nvoidpthread_testcancel(void);p在撤销线程的时候,可以编写程序让线程进一步进行所谓的“清理”工作,比如已经拥有了某个mutex,在清理例程中可以释放这个mutex;如果动态分配了内存,那么可以在清理例程中释放动态分配的内存。中中山山大大学学多多核核技技术术实实验验室室POSIX 信号量信号量pPOSIX信号量在多线程编程中可以起到同步或互斥的作用。用POSIX信号量可以实现传统操作系统P、V操作。p由于POSIX信号量不是内核负责维护,所以当进程退出后,POSIX信号量自动消亡。#includeintsem_init

17、(sem_t*sem,intpshared,unsignedintvalue);intsem_wait(sem_t*sem);intsem_trywait(sem_t*sem);intsem_post(sem_t*sem);intsem_getvalue(sem_t*sem,int*sval);intsem_destroy(sem_t*sem);中中山山大大学学多多核核技技术术实实验验室室线程和信号处理线程和信号处理p#includepintpthread_sigmask(inthow,constsigset_t*newmask,sigset_t*oldmask);n用来改变或者设置线程的信号屏蔽(signalmask),newmask用来执行新的信号屏蔽,设置新信号屏蔽以前的信号屏蔽被存放到oldmask指向的位置。pintpthread_kill(pthread_tthread,intsigno);n可以向其他线程发送信号。pintsigwait(constsigset_t*set,int*sig);n挂起调用sigwait()的线程,直到收到第一个参数set指向的信号集中指定的信号,且等待到信号被存放到第二个参数sig指向的位置。谢谢谢谢

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁