- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
本日要点: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;
}
在使用线程的参数时,一定要保证这个指针是有效的。当一个线程在通过指针
您可能关注的文档
最近下载
- 精神病司法鉴定暂行规定.doc VIP
- 《做一只努力向上的蜗牛》励志教育主题班会.pptx VIP
- Danfoss丹佛斯VLT® HVAC Basic Drive FC 101 SW 4.4x Operating guide说明书用户手册.pdf
- 城市更新项目质量管控实施方案.docx
- 中国国家标准 GB/T 18029.2-2022轮椅车 第2部分:电动轮椅车动态稳定性的测定.pdf
- 《GB/T 18029.1-2024轮椅车 第1部分:静态稳定性的测定》.pdf
- ISO9001-2022质量管理体系风险和机遇识别评价分析及应对措施记录表.docx VIP
- 《GB_T 18029.1-2024轮椅车 第1部分:静态稳定性的测定》专题研究报告.pptx
- 丹佛斯FC101变频器编程手册说明书.pdf VIP
- 丹佛斯FC111参数设置及丹佛斯变频器FC360使用说明.doc VIP
原创力文档


文档评论(0)