C++线程与网络接口技术(第一节:线程及其创建,调度与回收知识)

1.线程
创建第一个线程程序:(当然前提你得有支持线程的函数库)

class MyTask:public OS_Thread{//OS_THREAD为线程类
    private:virtual int Routine(){
        //重写Routine()函数
        for(int i=0;i<100;i++){
            printf("小和尚念经,有口无心!\n");
            OS_Thread::Sleep(3000);//每三秒一次              
        }
    }
}
//然后在main()函数中启动线程:
MyTask task;//
task.run();//主函数入口函数,记得不是Routine函数。

线程的调度:让出线程的方法:sleep()一下,让别的函数有机会运行。(如多个线程sleep一下,使其它线程有机会运行,即并发运行,特别地,主线程也需要sleep,使其并发执行。)
未完待续…….
2.线程的调度,sleep的使用
(1)进程与线程的区别
进程:当前正在运行的程序叫进程
线程:一个进程可以有多个线程同时运行
原则:进程可能使所有的线程都并发执行。
(2)调度算法
时间片法:以一个很小的时间片运行。(一个时间片后运行下一个程序)
1)使用sleep函数可以提前结束线程运行。(放入候选队列,然后由操作系统决定使用哪一个线程)
2)当苏醒时,进入候选队列。
优先级策略:一般不用,各个操作系统不一致。
实例:
如上面的函数,常用的睡眠函数:Msleep或者Sleep;
3.线程的创建与启动
创建线程,必须使用run函数;而不是routine;

class HeShang:public OS_Thread
{
private:
    virtual int Routine(){
        //线程体执行他的任务
        for (int i=0;i<100;i++)
        {
            printf("小和尚念经....\n");
            OS_Thread::Sleep(1);//秒级单位
        }
        return 0;
    }
};
class Xiucai:public OS_Thread
{
private:
    virtual int Routine(){
        //线程体执行他的任务
        for (int i=0;i<100;i++)
        {
            printf("小道士练气....\n");
            OS_Thread::Sleep(1);//秒级单位
        }
        return 0;
    }
};
int main(){
    Xiucai mytask1;
    mytask1.Run();
    HeShang mytask2;
    mytask2.Run();
    printf("----------主线程开始干活!----------\n");
    for (int i=0;i<10;i++)
    {
        printf("秀才读书\n");
        OS_Thread::Sleep(1);
    }
    getchar();
    return 0;

}

三个线程同时运行。线程是有限资源(一般至多几十个)
4.线程的停止与回收
所有线程从属于主线程,主线程停止,其它的肯定停止
线程的终止:保存数据,从当前步骤开始,善后一下,然后下一次再运行。接下来,讲解正常终止:
设置标志位:调用标志位,调用Join函数:
Join函数:(1)等待目标线程退出(2)回收这个线程的相关资源。
线程的启动:
相关函数

virtual int Routine(){
        for (int i=0;!m_quitflag&&i<100;i++)
        {
                printf("-------小和尚念经.....\n");
                OS_Thread::Sleep(1);
        }
        printf("Task Exit.\n");
        //  保存数据,善后工作
        printf("善后工作...\n");
            return 0;
    }
    HeShang h1;
    h1.m_quitflag=false;
    h1.run();
    getchar();
    h1.m_quitflag=true;

//善后工作未执行,需要等待一段时间,再退出。

HeShang h1;
    h1.m_quitflag=false;
    h1.run();
    getchar();
    h1.m_quitflag=true;
    OS_Thread::Join(&h1);

设置标质量通知其退出,然后调用Join()等待退出。
注意:Join不能自己回收自己,即不能在Routine()中调用自己
封装好的函数:

#include <stdio.h>
#include "osapi/osapi.h"
class HeShang:public OS_Thread{
public:
    int Start(){
        this->m_quitflag=false;
        Run();
        return 0;
    }
    void Stop(){
        m_quitflag=true;
        Join(this);//C++对象,不是线程,并不在运行时,所以不是线程。
    }
private:
    virtual int Routine(){
        for (int i=0;!m_quitflag&&i<100;i++)
        {
                printf("-------小和尚念经.....\n");
                OS_Thread::Sleep(1);
        }
        printf("Task Exit.\n");
        //  保存数据,善后工作
        printf("善后工作...\n");
            return 0;
    }
private:
    bool m_quitflag;
};

int main(){

    HeShang hes;
    hes.Start();//创建线程
    getchar();//让其暂停一下
    hes.Stop();//终止线程,等待退出。
    getchar();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值