嵌入式LINUX_C基础18全解.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式LINUX_C基础18全解

本日要点:1、线程 -X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X- 1.线程 1.1基本概念 线程是一种轻量级的代码并行的方式。如果需要,同时执行两段或者更多段的代码(代码并行),则必须使用多进程或多线程。Unix/Linux系统更多地采用了多进程,Windows系统更多地采用了多线程。 1.2进程和线程的区别: 每个进程都有自己独立的资源,比如内存;进程之间不能直接互访,必须使用IPC实现通信,是重量级的。 每个线程共享所在进程的资源,自己只需要一个独立的栈即可,是轻量级的 1.3系统、进程和线程的关系 操作系统支持多个进程并行,每个进程的内部允许多个线程并行。 进程本身其实并不能执行代码,只是为主线程(main函数)配齐资源(内存),由主线程负责执行进程的代码。 主线程和其他线程的关系:线程之间都是相互独立(如主线程sleep,其他线程也能够继续正常工作),但是又相互影响(如主线程一旦结束,则进程也结束;各个线程之间资源共享)。 1.4 CPU只有一个,线程如何运行: 代码运行的必备资源:CPU和内存。内存是可分的,支持并行;CPU不可分,不采用特殊处理方法则只能执行一个线程。 CPU把自己的时间分成了极小的CPU时间片,每个线程可以拥有时间片,有时间片的线程可以执行极小的的一段时间,时间消耗完了就交给其他有时间片的线程继续运行。严格来说,线程在时间点上是没有并行的,但是时间点无法观察,因此,我们承认线程是并行的。 Unix系统提供了完整的线程的一套函数,直接使用即可。 多进程步骤:引入头文件pthread.h,提供了libpthread.so库文件 1.线程的创建;线程的函数大多数以”pthread_”开头 pthread_create()函数 功能:创建一个线程。 格式:#include pthread.h int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 注意:第一个参数:一个指针,这是一个传出参数,用来接收线程创建成功后的线程ID,这是一个整数; 第二个参数:一个结构体指针,用来传入要创建的线程的属性,一般情况下使用默认属性即可,一般给NULL即可; 第三个参数:一个函数指针,这个函数指针指向的函数的返回值为void*,参数也是void*。系统启动新线程后,执行某个函数的代码,这个函数有此参数指定,然后对这个函数与主函数并行处理; 第四个参数:为第三个参数指定的函数提供形式参数,与第三个参数联合指定了执行哪个参数,用什么参数; 返回值:成功返回0,失败返回错误码。线程的错误处理不使用errno、perror(),而是直接返回错误码。 多线程启动时,代码运行是:每个线程内部是顺序执行,线程之间乱序执行。 ****创建一个新线程,并观察主线程和新线程的运行特点****************************** #includestdio.h #includepthread.h #includestring.h void*task(void*p) { int i; for(i=0;i50;i++) { printf(task:%d\n,i); usleep(1); } } int main() { pthread_t id; //pthread_create函数只是告知系统创建进程,不保证马上运行,通知完了就继续运行下面的代码 int res=pthread_create(id,NULL,task,NULL); if(res) { printf(%s\n,strerror(res)); } else { printf(线程成功启动\n); } int i; for(i=0;i50;i++) { printf(main:%d\n,i); usleep(3); } //使用延时保证在其他线程执行结束前,不让主线程结束;因为主线程一旦结束,所有线程都结束 sleep(2); return 0; } 在使用线程的参数时,一定要保证这个指针是有效的。当一个线程在通过指针

文档评论(0)

1520520 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档