操作系统实验一、线程的创建与撤销
实验一:线程的创建与撤销
一、实验目的
(1)熟悉windows系统提供的线程创建与撤销系统调用。
(2)掌握windows系统环境下线程的创建与撤销方法。
二、实验准备
线程的概念
(1)线程(thread),是操作系统能够进行运算调度的最小单位。
(2)它被包含在进程之中,是进程中的实际运作单位。
(3)线程是独立调度和分配的基本单位。
(4)一条线程指的是进程中一个单一顺序的控制流。
(5)一个进程中可以并发多个线程,每条线程并行执行不同的任务。
工具
1.创建线程
CreateThread()完成线程的创建,它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立的线程的句柄。
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,//为线程指定安全属性DWORD dwStackSize, //线程堆栈的大小,传入0表示默认大小(1MB)LPSECURITY_START_ROUTINE lpStartAddress, //指定线程要执行的函数LPVOID lpparameter, //函数要传递的参数,NULL表示无参数传入DWORD dwCreationFlags, //指定线程创建后所处的状态LPDWORD lpThreadId //系统返回的线程标识符)
2.撤销进程
ExitThread()函数,强制线程终止运行:该函数将终止线程的运行,并导致操作系统清楚该线程使用的所有操作系统资源。(ps:C++资源,如C++类对象,将不被撤销)
3.终止线程
TeminateThread()函数也能够终止线程的运行,该函数与ExitThread()的区别在于,ExitThread()在撤销线程是将该线程所拥有的资源全部归还给系统,而TerminateThread()不归还资源。(在这里不推荐使用)
4.关闭句柄
CloseHandle()用于关闭已打开的对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使线程安全运行。
三、实验内容
代码分析:
1.创建单线程:
void eatApple(int apple_number)
{Sleep((3-apple_number)*1000);printf("I'm eating apple #%d\n",apple_number);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{int a=0;int b=1;int c=2;eatApple(a);eatApple(b);eatApple(c);return 0;
}
2.创建多线程:
void eatApple(int apple_number)
{Sleep((3-apple_number)*1000);printf("I'm eating apple #%d\n",apple_number);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{HANDLE handle1=NULL;HANDLE handle2=NULL;HANDLE handle3=NULL;DWORD ThreadID1=NULL;DWORD ThreadID2=NULL;DWORD ThreadID3=NULL;int a=0;int b=1;int c=2;handle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) eatApple,(LPVOID) a,0,&ThreadID1);handle2=CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) eatApple,(LPVOID) b,0,&ThreadID2);handle3=CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) eatApple,(LPVOID) c,0,&ThreadID3);Sleep(10000);return 0;
}
3.撤销进程:
void eatApple(int apple_number)
{Sleep((3-apple_number)*1000);printf("I'm eating apple #%d\n",apple_number);while(1){printf("#%d is exiting.\n",apple_number);ExitThread(0);}
}
四、实验结果与总结
1.创建单线程执行结果:
eatApple()函数里休眠时间中要用3减去苹果个数,这样的话,传递的参数就不能超过3,等于3的时候休眠时间为0,与上一条语句同时输出,超过3无意义?
2.创建多线程执行结果:
在主函数中必须要加入休眠语句,这样不会因为主线程的结束而使创建的线程结束。同时由于sleep函数的介入,运行顺序被更改,表示三个进程运行不相互影响。(单线程与多线程的运行顺序是相反的。)
3.撤销进程执行结果:
想知道调用ExitThread()时参数为什么为0?
操作系统实验一、线程的创建与撤销相关推荐
- devexpress 创建窗口句柄时出错_实验一 线程的创建和撤销
实验内容:编写和调试一个程序,实现Windows系统环境下通过API函数进行线程创建与撤销. 实验目的: (1) 熟悉Windows系统提供的线程创建和撤销系统调用: (2) 掌握Windows系统环 ...
- 操作系统实验一:线程的创建与撤销
实验一:线程的创建与撤销 2.1.1 实验目的 (1)熟悉Windows系统提供的线程创建与撤销系统调用. (2)掌握Windows系统环境下线程的创建与撤销方法. 2.1.2 实验准备知识 1.线程 ...
- Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc
操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...
- 操作系统实验二进程的创建控制实验(含代码及实验心得)
实现工具:PC机 实现环境:Linux 实习内容(功能.目标): 实验目的: 创建进程,体会进程间的并发特征. 实验内容: 编写一段程序,使用系统调用 fork() 创建两个子进程 p1 和 p2 ...
- 11月26日:操作系统实验杂记 shmget(创建共享存储区) shmat(连接共享存储区) shmdt(断连共享存储区) shmctl(共享存储区控制)
文章目录 函数语法介绍 1.创建共享存储区shmget 2.连接共享存储区shmat 3.断连共享存储区shmdt 4.控制共享存储区shmctl 示例程序代码 进程1代码 进程2代码 函数语法介绍 ...
- 操作系统 实验三:线程的互斥
实验三:线程的互斥 2.3.1实验⽬的 (1)熟练掌握Windows系统环境下线程的创建与撤销. (2)熟悉Windows系统提供的线程互斥API. (3)使⽤Windows系统提供的线程互斥API解 ...
- linux c 线程的创建、线程等待、线程终止、线程分离
1. 什么是线程 线程是进程执行内部的一个执行分支,在一个进程内部运行的多种执行流:内部本质上是多个线程在同一个地址空间运行:第一个pcb称之为主线程:有多个线程就有多个执行流:一个进程至少有一个 ...
- 操作系统--用户级线程和内核级线程
在多线程操作系统中,各个系统的实现方式并不相同.在有的系统中实现了用户级线程,有的系统中实现了内核级线程 1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调 ...
- 操作系统实验--进程的创建撤销和控制
进程的创建撤销和控制 一.实验名称 进程的创建撤销和控制 二.实验内容 学生独立设计用于描述进程的数据结构,完成进程的创建.同步和互斥. 三.实验原理和设计思路 在Linux系统下用fork()函数创 ...
最新文章
- java 性能调优:35 个小细节,让你提升 java 代码的运行效率
- 京东果然发福了:宣布涨薪两个月! 2 年内将员工平均薪资涨至 16 薪
- 新建Java文件的 文档注释
- 15年IT研发老兵的困惑,生存与生活的状态
- html编辑完后扩展名是,【填空题】使用文本编辑器编辑完HTML后,扩展名可以是 或 。...
- springboot 整合mybatisplus输出sql语句不输出结果集
- 201621123058 《java课程设计》第九周学习总结
- python接口自动化(十九)--Json 数据处理---实战(详解)
- 关于IE、Firefox、Opera页面呈现异同(转载)
- 操作数据----DML语句
- 5.4使用Mockito to mock来测试
- Hive编程指南(含目录,高清,免费)
- jquery常用方法之siblings方法
- 【ZT】【详细教程】WPS如何关闭自动更新和WPS热点?(ksomisc.exe)
- 中秋节后如何有面子的带女票回家?
- 完整性与完备性的区别
- BIM建模助手上线一周,有哪些BUG被用户找到?
- 团体程序设计天梯赛--个人总结
- matlab软件_MATLAB软件概述
- IntelliJ IDEA 自动消除行尾空格