CC++应用篇(001) 01_1创建第一个线程

特别声明,本系列学习教程来自【阿发你好】 官网地址:阿发你好
版权声明:本文为博主-黄可可(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: 它一旦退出,程序就退出。那么其他线程也就没了。(所以不能让主线程轻易退出)
视频教程地址:阿发你好
示例代码地址:Github-hkkhuang
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值