- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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;
}
在使用线程的参数时,一定要保证这个指针是有效的。当一个线程在通过指针
您可能关注的文档
最近下载
- 2024-2025学年初中信息技术(信息科技)七年级全一册义务教育版(2024)教学设计合集.docx
- 《眼耳鼻咽喉口腔科护理学》教案 第13课 耳鼻咽喉科常见疾病患者的护理(三).docx VIP
- 2025年江苏南京中考语文试卷(真题--含答案) .pdf VIP
- 统编版(2024)道德与法治七年级上册期末复习全册知识点提纲.docx VIP
- 建筑工程述标(鲁班奖项目超高层框架结构技术答辩).pptx VIP
- 混凝土结构通用规范GB55008-2021知识培训.pptx VIP
- 《电梯关键部件寿命评估技术规范》.pdf VIP
- 高压氧舱技术的进步与挑战.docx VIP
- 消防考试试题100题及答案.docx VIP
- 2025电力企业数字化转型成熟度评价指南.pdf VIP
文档评论(0)