实验一:线程的创建与撤销

一、实验目的

(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?

操作系统实验一、线程的创建与撤销相关推荐

  1. devexpress 创建窗口句柄时出错_实验一 线程的创建和撤销

    实验内容:编写和调试一个程序,实现Windows系统环境下通过API函数进行线程创建与撤销. 实验目的: (1) 熟悉Windows系统提供的线程创建和撤销系统调用: (2) 掌握Windows系统环 ...

  2. 操作系统实验一:线程的创建与撤销

    实验一:线程的创建与撤销 2.1.1 实验目的 (1)熟悉Windows系统提供的线程创建与撤销系统调用. (2)掌握Windows系统环境下线程的创建与撤销方法. 2.1.2 实验准备知识 1.线程 ...

  3. Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc

    操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...

  4. 操作系统实验二进程的创建控制实验(含代码及实验心得)

    实现工具:PC机 实现环境:Linux 实习内容(功能.目标): 实验目的:  创建进程,体会进程间的并发特征. 实验内容:  编写一段程序,使用系统调用 fork() 创建两个子进程 p1 和 p2 ...

  5. 11月26日:操作系统实验杂记 shmget(创建共享存储区) shmat(连接共享存储区) shmdt(断连共享存储区) shmctl(共享存储区控制)

    文章目录 函数语法介绍 1.创建共享存储区shmget 2.连接共享存储区shmat 3.断连共享存储区shmdt 4.控制共享存储区shmctl 示例程序代码 进程1代码 进程2代码 函数语法介绍 ...

  6. 操作系统 实验三:线程的互斥

    实验三:线程的互斥 2.3.1实验⽬的 (1)熟练掌握Windows系统环境下线程的创建与撤销. (2)熟悉Windows系统提供的线程互斥API. (3)使⽤Windows系统提供的线程互斥API解 ...

  7. linux c 线程的创建、线程等待、线程终止、线程分离

    1. 什么是线程   线程是进程执行内部的一个执行分支,在一个进程内部运行的多种执行流:内部本质上是多个线程在同一个地址空间运行:第一个pcb称之为主线程:有多个线程就有多个执行流:一个进程至少有一个 ...

  8. 操作系统--用户级线程和内核级线程

    在多线程操作系统中,各个系统的实现方式并不相同.在有的系统中实现了用户级线程,有的系统中实现了内核级线程 1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调 ...

  9. 操作系统实验--进程的创建撤销和控制

    进程的创建撤销和控制 一.实验名称 进程的创建撤销和控制 二.实验内容 学生独立设计用于描述进程的数据结构,完成进程的创建.同步和互斥. 三.实验原理和设计思路 在Linux系统下用fork()函数创 ...

最新文章

  1. java 性能调优:35 个小细节,让你提升 java 代码的运行效率
  2. 京东果然发福了:宣布涨薪两个月! 2 年内将员工平均薪资涨至 16 薪
  3. 新建Java文件的 文档注释
  4. 15年IT研发老兵的困惑,生存与生活的状态
  5. html编辑完后扩展名是,【填空题】使用文本编辑器编辑完HTML后,扩展名可以是 或 。...
  6. springboot 整合mybatisplus输出sql语句不输出结果集
  7. 201621123058 《java课程设计》第九周学习总结
  8. python接口自动化(十九)--Json 数据处理---实战(详解)
  9. 关于IE、Firefox、Opera页面呈现异同(转载)
  10. 操作数据----DML语句
  11. 5.4使用Mockito to mock来测试
  12. Hive编程指南(含目录,高清,免费)
  13. jquery常用方法之siblings方法
  14. 【ZT】【详细教程】WPS如何关闭自动更新和WPS热点?(ksomisc.exe)
  15. 中秋节后如何有面子的带女票回家?
  16. 完整性与完备性的区别
  17. BIM建模助手上线一周,有哪些BUG被用户找到?
  18. 团体程序设计天梯赛--个人总结
  19. matlab软件_MATLAB软件概述
  20. IntelliJ IDEA 自动消除行尾空格

热门文章

  1. CodeForces - 1082B Vova and Trophies
  2. 线程池大小设置和CPU核心数的关系
  3. 年终总结 | 在开源、博客和搬砖的路上砥砺前行「2020」
  4. 吴用又说道 起名软件
  5. jQuery 一次定时器_为什么JVM每隔一小时执行一次Full GC?
  6. 新世纪大学英语(第二版)综合教程第一册 Unit 1 重点单词
  7. 飞机螺旋(又称尾旋)产生原因、受力分析、解决方法、螺旋改出
  8. [LUOGU]P5149 会议座位
  9. 深度优先算法(DFS)和广度优先算法(BFS)时间复杂度和空间复杂度计算精讲
  10. vue前后台分离上传图片到服务器