您的位置:首页 > 理论基础 > 计算机网络

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

2016-06-07 11:21 169 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息