客户网站建设确认书,做网站不会写代码,asp学校网站系统,手工木雕网站建设策划书并发
前面编写的程序都是从mian函数开始#xff0c;从上往下执行#xff0c;称为顺序执行
假设一个程序需要I输入 C计算 P输出#xff0c;以顺序执行三个上述程序#xff0c;则其执行过程如下#xff1a; 程序内部的语句是一条一条的执行#xff0c;如果要运行多个程序…并发
前面编写的程序都是从mian函数开始从上往下执行称为顺序执行
假设一个程序需要I输入 C计算 P输出以顺序执行三个上述程序则其执行过程如下 程序内部的语句是一条一条的执行如果要运行多个程序这些程序也是一个一个的依次执行若上述的三种操作每种操作需要的时间都是t则执行上述三个程序共需要9t
而在上述程序的执行过程中只有计算需要用到cpu》CPU的利用率只有 3t/9t 33.33%
顺序执行的CPU利用率太低
有没有办法提高CPU利用率呢
》并发
1.并发执行
并发 指的是同一时间内同时处理多个任务的机制
我们现在的操作系统几乎都支持并发执行并且提供并发的实现机制》Linux并发进程和并发线程
所谓并发是指多个任务在“同一时间”被处理》“同一时间”指的是一段时间而不是某个时间点
同一时间点有多个任务同时被处理称之为并行多核cpu的实现
并发执行的实现是将一个任务按其功能分为多个阶段并且不同的阶段有不同的组件去完成因此当一个任务在执行其中的某个功能的时候其他组件可以去执行另外的已经就绪的功能 原本需要9t才能完成的任务此时只需要5t意味着CPU的利用率达到了3T/5T60%有效的提高了CPU的利用率
2.Linux线程并发的实现
线程是指在一个程序执行过程中开辟多条执行分支去同时处理不同的任务的一种机制
“执行分支”就是所谓的线程 程序在运行时从mian函数开始执行的分支称为主线程主线程是程序程序执行的伊始同时一旦主线程执行结束整个程序也就结束了不管其他的分支线程是否执行完成都会随着主线程一起结束
如何在程序执行过程中创建新的执行分支线程呢
创建线程
Linux中的线程是采用POSIX提供的接口来创建和维护因此需要引用头文件pthread.h ,同时在编译时需要链接POSIX库
即我们编译时要加上-pthread
创建线程是通过调用下列函数来实现
NAMEpthread_create - create a new threadSYNOPSIS#include pthread.hpthread_create用来创建一个新的线程int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);thread:指针指向一个pthread_t类型的变量用来存储线程的编号线程号attr:指定线程属性一般为NULLstart_routine函数指针指向一个返回值为void*,参数为void*的函数是用来指定新创建的线程需要执行的函数arg:void*指针指向用于传递给线程函数的参数返回值成功是0失败返回一个0值是函数调用失败的错误编码Compile and link with -pthread.
注意如果在一个程序执行过程中创建了线程则主线程和分支线程是“同时”执行的
例如:
在一个程序中创建两个执行分支其中
1.主分支不断输出’hello
2.1号分支不断输出nihao
3.2号分支不断输出一个gun
顺序执行的结果 #include stdio.h
#include pthread.h
#include unistd.hvoid* thread_function1(void*arg)
{while(1){printf(nihao\n);sleep(1);}
}void* thread_function2(void*arg)
{while(1){printf(gun\n);sleep(1);}
} int main (void)
{thread_function1(NULL);thread_function2(NULL);while(1){printf(hello\n);sleep(1);}}通过线程方式实现 #include stdio.h
#include pthread.h
#include unistd.hvoid* thread_function1(void*arg)
{while(1){printf(nihao\n);sleep(1);}
}void* thread_function2(void*arg)
{while(1){printf(gun\n);sleep(1);}
} int main (void)
{//thread_function1(NULL);//thread_function2(NULL);pthread_t tid1,tid2;int ret 0;ret pthread_create(tid1, NULL,thread_function1, NULL);//创建一个线程去执行thread_function1函数并且传递的参数为NULLif (0 ! ret){printf(pthread1 create error:%d\n,ret );}ret pthread_create(tid2, NULL,thread_function2, NULL);//创建一个线程去执行thread_function1函数并且传递的参数为NULLif (0 ! ret){printf(pthread1 create error:%d\n,ret );}while(1){printf(hello\n);sleep(1);}}上述案例中创建了两个分支线程主线程 总共有三个线程在同时执行因此可以同时处理三个死循环的任务
并且虽然三个线程执行的是不同的代码但是都处于一个程序中他们可以访问相同的全局变量
任务
在项目中创建多个线程让不同的线程去完成不同的工作并且与你设计的初始界面的按键相匹配
1.电子相册
2.GY-39数据的采集并将数据保存在全局变量中
3.高温报警器
4.将全局变量中的数据显示到LCD屏幕中
5.小游戏
主线程负责获取触摸屏的输入事件来实现人机交互
个线程执行的是不同的代码但是都处于一个程序中他们可以访问相同的全局变量
任务电子相册 智能家居 小游戏三合一项目 需要私信我
在项目中创建多个线程让不同的线程去完成不同的工作并且与你设计的初始界面的按键相匹配
1.电子相册
2.GY-39数据的采集并将数据保存在全局变量中
3.高温报警器
4.将全局变量中的数据显示到LCD屏幕中
5.小游戏
主线程负责获取触摸屏的输入事件来实现人机交互