特别声明,本系列学习教程来自【阿发你好】 官网地址:阿发你好
版权声明:本文为博主-黄可可(hkkhuang)-原创文章,未经博主允许可转载,但请标明出处,谢谢!
1、引例 和尚念经,秀才读书
假设你负责管理一个和尚Buddhist、一个秀才Confucian
安排他们一天的工作:和尚:念经100遍;秀才:读书500遍
函数实现 依次完成 串行调用
#include <stdio.h>
#include <stdlib.h>
//和尚念经100遍
void Buddhist()
{
for (int i=0;i<100;i++)
{
printf("和尚念经。。。\n");
}
}
//秀才读书500遍
void Confucian()
{
for (int i = 0; i < 500; i++)
{
printf("秀才读书。。。\n");
}
}
int main()
{
//函数实现 依次完成 串行调用
Buddhist();
Confucian();
system("Pause");
return 0;
}
问题:
(1)他们俩不能同时干活,只能一个接着一个
(2)你也不能干自己的活,必须等同他们干完了。。
根本原因: 函数调用是串行的!!
2、线程
2.1、线程 : Thread
线程技术用于实现并发的任务,让多个任务可以同时运行。
换一种说法:把每个任务放在各自的线程中运行。
运行模式
主线: main函数本身这条线,称为主线。
线程1,2: 使用Thread技术创建的线程,它们用于运行并发的任务
建一个线程
#include <stdio.h>
#include <stdlib.h>
#include "osapi/osapi.h"
//定义一个类
class MyTask:public OS_Thread
{
private:
virtual int Routine()
{
//线程体:执行他的任务
for (int i = 0; i < 100; i++)
{
printf("和尚念经。。。\n");
OS_Thread::Sleep(1); //静态函数
}
return 0;
}
};
int main()
{
MyTask task;
task.Run();
getchar();
return 0;
}
3、线程的调度
所有的线程分享CPU,而CPU只有一块。
线程调度:
(1)所以每个线程都要自觉地让出CPU,让别的线程也有机会被运行。使用Sleep
(2)操作系统让会把时间分割成很细的小片,让每个线程都有机会运行几毫秒,轮流运行。(总体上感觉是每个线程在同时运行)
如何让出CPU?
使用Sleep函数让一个线程处于“睡一会”
当它睡下的时候,就把CPU让给其他线程了。操作系统会统一调度,决定该运行哪一个线程。
把和尚和秀才的任务用线程来实现
#include <stdio.h>
#include <stdlib.h>
#include "osapi/osapi.h"
//定义一个类
class Buddhist :public OS_Thread
{
private:
virtual int Routine()
{
//线程体:执行他的任务
for (int i = 0; i < 100; i++)
{
printf("和尚念经。。。\n");
OS_Thread::Sleep(1); //静态函数
}
return 0;
}
};
//定义一个类
class Confucian :public OS_Thread
{
private:
virtual int Routine()
{
//线程体:执行他的任务
for (int i = 0; i < 100; i++)
{
printf("秀才读书。。。\n");
OS_Thread::Sleep(1); //静态函数
}
return 0;
}
};
int main()
{
Buddhist b;
b.Run();
Confucian c;
c.Run();
getchar();
return 0;
}
//秀才读书。。。
//和尚念经。。。
//和尚念经。。。
//秀才读书。。。
//秀才读书。。。
//和尚念经。。。
//秀才读书。。。
//和尚念经。。。
//秀才读书。。。
//和尚念经。。。
//秀才读书。。。
//和尚念经。。。
//秀才读书。。。
//和尚念经。。。
//秀才读书。。。
//和尚念经。。。
//......
在新创建的线程工作的同时,主线程不受影响,可以正常执行
int main()
{
Buddhist b;
b.Run();
Confucian c;
c.Run();
//两个子线程同时工作,主线程也可以工作,不影响
printf("-------------main主线程开始工作-------------\n");
for (int i = 0; i < 100; i++)
{
printf("管理人员开始工作。。。。。。。。。\n");
//主线程在执行的过程中也是需要sleep,让出cpu
OS_Thread::Sleep(1);
}
getchar();
return 0;
}
------------ - main主线程开始工作------------ -
//管理人员开始工作。。。。。。。。。
//秀才读书。。。
//和尚念经。。。
//管理人员开始工作。。。。。。。。。
//和尚念经。。。
//秀才读书。。。
//管理人员开始工作。。。。。。。。。
//秀才读书。。。
//和尚念经。。。
//管理人员开始工作。。。。。。。。。
//秀才读书。。。
//和尚念经。。。
//......
4、小结
- 1.认识到函数调用是无法实现并行的任务的
- 2.初步理解线程的概念,创建第一个线程
- 3.学会用Sleep来让出CPU
- 4.主线程main: 它一旦退出,程序就退出。那么其他线程也就没了。(所以不能让主线程轻易退出)