C++线程与网络接口技术(第一节:线程及其创建,调度与回收知识)
2016-06-07 11:21
169 查看
1.线程
创建第一个线程程序:(当然前提你得有支持线程的函数库)
线程的调度:让出线程的方法:sleep()一下,让别的函数有机会运行。(如多个线程sleep一下,使其它线程有机会运行,即并发运行,特别地,主线程也需要sleep,使其并发执行。)
未完待续…….
2.线程的调度,sleep的使用
(1)进程与线程的区别
进程:当前正在运行的程序叫进程
线程:一个进程可以有多个线程同时运行
原则:进程可能使所有的线程都并发执行。
(2)调度算法
时间片法:以一个很小的时间片运行。(一个时间片后运行下一个程序)
1)使用sleep函数可以提前结束线程运行。(放入候选队列,然后由操作系统决定使用哪一个线程)
2)当苏醒时,进入候选队列。
优先级策略:一般不用,各个操作系统不一致。
实例:
如上面的函数,常用的睡眠函数:Msleep或者Sleep;
3.线程的创建与启动
创建线程,必须使用run函数;而不是routine;
三个线程同时运行。线程是有限资源(一般至多几十个)
4.线程的停止与回收
所有线程从属于主线程,主线程停止,其它的肯定停止
线程的终止:保存数据,从当前步骤开始,善后一下,然后下一次再运行。接下来,讲解正常终止:
设置标志位:调用标志位,调用Join函数:
Join函数:(1)等待目标线程退出(2)回收这个线程的相关资源。
线程的启动:
相关函数
//善后工作未执行,需要等待一段时间,再退出。
设置标质量通知其退出,然后调用Join()等待退出。
注意:Join不能自己回收自己,即不能在Routine()中调用自己。
封装好的函数:
创建第一个线程程序:(当然前提你得有支持线程的函数库)
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; }
相关文章推荐
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- 浅析linux环境下一个进程最多能有多少个线程
- 再谈JavaScript线程
- C#实现终止正在执行的线程
- Java线程编程中的主线程讲解