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

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

一、实验目的

(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.创建单线程执行结果:

1

eatApple()函数里休眠时间中要用3减去苹果个数,这样的话,传递的参数就不能超过3,等于3的时候休眠时间为0,与上一条语句同时输出,超过3无意义?

2.创建多线程执行结果:

2

在主函数中必须要加入休眠语句,这样不会因为主线程的结束而使创建的线程结束。同时由于sleep函数的介入,运行顺序被更改,表示三个进程运行不相互影响。(单线程与多线程的运行顺序是相反的。)

3.撤销进程执行结果:

3

想知道调用ExitThread()时参数为什么为0?

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下线程创建撤销的基本方法,以Java语言为例。 线程创建: 在Java中,有两种方式可以创建线程: 1. 继承Thread类,并重写run()方法。 2. 实现Runnable接口,并重写run()方法。 以下是使用第二种方式创建线程的示例代码: ``` class MyThread implements Runnable { public void run() { System.out.println("This is a new thread."); } } public class ThreadDemo { public static void main(String[] args) { MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start(); } } ``` 线程撤销: Java中可以使用stop()方法来撤销线程,但该方法已被废弃,因为它可能会导致线程意外终止,从而导致应用程序的不稳定性。Java建议使用interrupt()方法来请求线程停止。 以下是使用interrupt()方法停止线程的示例代码: ``` class MyThread implements Runnable { public void run() { while(!Thread.currentThread().isInterrupted()) { System.out.println("This is a new thread."); } System.out.println("Thread is stopped."); } } public class ThreadDemo { public static void main(String[] args) { MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } thread.interrupt(); } } ``` 在上述代码中,MyThread类的run()方法中,使用了isInterrupted()方法检查线程是否被请求停止。在主线程中,使用interrupt()方法请求线程停止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值