电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > PPT文档下载
分享到微信 分享到微博 分享到QQ空间

linux 多线程技术

  • 资源ID:54571039       资源大小:1.60MB        全文页数:25页
  • 资源格式: PPT        下载积分:10金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要10金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

linux 多线程技术

Linux 多线程技术,POSIX 线程库Pthreads,使用fork() 创建进程 代价昂贵 进程间通信方式较复杂 操作系统在实现进程间的切换比线程切换更费时,使用pthreads库创建线程 创建进程比创建线程更快 线程间的通信方式更容 操作系统对线程的切换比对进程的切换更容易和快速,线程的创建,#include int pthread_create(pthread_t * thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg ); 第一个参数为指向线程标识符的指针。 第二个参数用来设置线程属性。 第三个参数是线程运行函数的起始地址。 最后一个参数是运行函数的参数。 当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。,一个简单例子,#include #include #include #include #include pthread_t ntid; void *thr_fn(void *arg) printids(“new thread:“); return (void *)0); int main() int err; err = pthread_create( ,编译多线程程序,gcc -o mypthread -lpthread mypthread.c,线程的退出,调用pthread_exit()结束线程执行 void pthread_exit(void *retval); 让线程处理程序返回 使用 pthread_cancel() 函数终止其他线程的执行 int pthread_cancel(pthread_t thread); 向线程t发送取消请求,默认情况下线程thread自己调用pthread_exit(PTHREAD_CANCELED),,等待线程结束,使用 pthread_join() 函数等待被创建的线程结束 pthread_join() 函数会挂起创建线程的线程的执行 直到等待到想要等待的子线程 函数原型 : int pthread_join(pthread_t th, void *thread_return);,线程的分离,主线程可以不断地创建子线程 子线程本身自己有自我回收内存资源的能力 函数原型: int pthread_detach(pthread_t th); pthread_detach() 和 pthread_join() 一般情况下不能同时使用,获得当前线程的标志,pthread_t pthread_self(void); 本函数返回本线程的标识符。 在LinuxThreads中,每个线程都用一个pthread_descr结构来描述,其中包含了线程状态、线程ID等所有需要的数据结构,此函数的实现就是在线程栈帧中找到本线程的pthread_descr结构,然后返回其中的p_tid项。,一个例子,#include #include #include #include #define THREAD_NUMBER 2 int retval_hello1= 2, retval_hello2 = 3; void* hello1(void *arg) char *hello_str = (char *)arg; sleep(1); printf(“%sn“, hello_str); pthread_exit( ,void* hello2(void *arg) char *hello_str = (char *)arg; sleep(2); printf(“%sn“, hello_str); pthread_exit(,printf(“Begin to create threads.n“); ret_val = pthread_create( ,printf(“Begin to wait for threads.n“); for(i = 0; i THREAD_NUMBER; i+) ret_val = pthread_join(pti, (void *) ,线程属性的初始化和撤销,线程初始化: int pthread_attr_init(pthread_attr_t *attr) 初始化线程属性对象attr,并用默认值填充 线程撤销: int pthread_attr_destroy(pthread_attr_t *attr) 销毁线程属性对象attr。 *修改线程属性对象attr只有在线程创建前有效,在线程创建后修改对当前线程不起作用。 *返回0成功,否则失败。,pthread_attr_t定义,pthread_attr_t定义: typedef struct _pthread_attr_s int _detachstate; int _schedpolicy; struct _sched_param _schedparam; int _inheritsched; int _scope; size_t _guardsize; int _stackaddr_set; void *_stackaddr; size_t _stacksize; pthread_attr_t;,线程的属性,线程的属性(续),相关函数-分离状态,设置分离状态:pthread_attr_setdetachstate int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); 返回值:函数成功返回0;任何其他返回值都表示错误 设置分离状态。 参数detachstate的值为:PTHREAD_CREATE_DETACHED、PTHREAD_CREATE_JOINABLE。 获取分离状态:pthread_attr_getdetachstate int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate); 返回值:函数成功返回0;任何其他返回值都表示错误 取线程分离状态:分离的或是非分离的。,相关函数-调度策略,设置调度策略:pthread_attr_setschedpolicy int pthread_attr_setschedpolicy(pthread_attr_t *tattr, int policy); 返回值:函数成功返回0;任何其他返回值都表示错误 。 POSIX标准定义的调度策略有:SCHED_FIFO(先入先出)、SCHED_RR(循环)、SCHED_OTHER(由不同版本的POSIX线程库定义的缺省调度策略)。 获取调度策略:pthread_attr_getschedpolicy int pthread_attr_getschedpolicy(pthread_attr_t *tattr, int *policy); 返回值:函数成功返回0;任何其他返回值都表示错误 。,相关函数-调度参数,设置调度参数:pthread_attr_setschedparam int pthread_attr_setschedparam(pthread_attr_t *tattr, const struct sched_param *param); 返回值:函数成功返回0;任何其他返回值都表示错误 。 属性对象的调度参数定义在param结构中;在这个结构中只定义了优先级priority成员。新创建线程的优先级由属性对象中param结构的priority参数指定。 有两种方式可以修改线程的优先级。可以在创建子线程前设置属性对象的优先级参数;也可以先修改父线程的优先级,然后创建子线程。 sched_param结构中有可能存放着其他一些调度信息。所以在修改线程属性对象的调度参数前先取现有的调度参数是良好的习惯。 一段合理的代码应该是这样的:先取线程属性对象中现有的调度参数,对取出的调度参数进行操作,再用修改过的调度参数重置线程属性对象。 获取调度参数:pthread_attr_getschedparam int pthread_attr_getschedparam(pthread_attr_t *tattr, const struct sched_param *param); 返回值:函数成功返回0;任何其他返回值都表示错误 。,相关函数-域,设置域:pthread_attr_setscope int pthread_attr_setscope(pthread_attr_t *tattr, int scope); 返回值:函数成功返回0;任何其他返回值都表示错误 。 指定将来创建的线程是绑定(PTHREAD_SCOPE_SYSTEM)的还是非绑定的(PTHREAD_SCOPE_PROCESS)。 在一个进程中可以同时有这两种不同类型的线程。 获取域:pthread_attr_getscope int pthread_attr_getscope(pthread_attr_t *tattr, int *scope); 返回值:函数成功返回0;任何其他返回值都表示错误。,例子:threadattr,#include #include #include void* sum_val(void *arg) int sum = 0; int i; int count = *(int *)arg; for (i = 0; i count; i+) sum = sum + i; printf(“sum is %dn“, sum); pthread_exit(0); ,例子:threadattr(续),int main(int argc, char *argv) pthread_t pt; int count = 10; int ret_val; pthread_attr_t attr; struct sched_param sp; sp._sched_priority = 2; ret_val = pthread_attr_init( ,例子:threadattr(续),ret_val = pthread_attr_setdetachstate( ,例子:threadattr(续),ret_val = pthread_attr_setinheritsched( ,

注意事项

本文(linux 多线程技术)为本站会员(第***)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.