当前位置:文档之家› 实验一 进程与线程

实验一 进程与线程

实验:进程与线程
一、实验目的
通过函数调用掌握进程之间的通信。

体会线程的存在,了解线程与进程的关系。

二、实验环境
PC+Win7操作系统
三、实验方法和实验步骤
1.准备工作
打开VC++6.0环境。

2.在程序编辑区内输入程序,实现两个数互换。

3. 在VC环境下建立一个控制台应用程序P1。

系统启动一个进程(因为支持线程,OS会在进程中主动创建一个主线程)来运行该程序。

输出该进程的ID号、以及该进程下面主线程的ID号。

多运行几次,观察结果。

四、实验结果
补充:在VC环境下建立一个控制台应用程序P1。

系统启动一个进程(因为支持线程,OS会在进程中主动创建一个主线程)来运行该程序。

在进程中,我们自己再创建一个子线程(子线程1),该子线程做的事情很简单,就是让它不停地输出如下信息:
子线程1正在运行第1次,其进程的ID号=~, 子线程1的ID号=~
子线程1正在运行第2次,其进程的ID号=~, 子线程1的ID号=~。

子线程1正在运行第20次,其进程的ID号=~, 子线程1的ID号=~
只要启动了一个子线程,实际上系统中是主线程和子线程1在并发执行。

主线程的功能是输出这样形式的内容:
主线程正在运行第1次,其进程的ID号=~,主线程的ID号=~
主线程正在运行第2次,其进程ID号=~, 主线程的ID号=~。

主线程正在运行第20次,其进程ID号=~, 主线程的ID号=~
多运行几次,观察主线程和子线程并发调动的次序。

每次调度都一样吗?为什么?进程ID、主线程ID和子线程ID每次都一样吗?
体会操作系统中并发的异步性。

程序代码如下:
#include<stdio.h>
#include<afxmt.h>
DWORD WINAPI Thread1(LPVOID lpparameter){
int i;
for(i=1;i<=20;i++){
printf("子线程1在运行中,它正在运行第%d times,所属进程的ID号=%ld, 本线程的ID号=%ld\n",i,GetCurrentProcessId(),GetCurrentThreadId());}
return 0;}
int main(){
int j;
printf("一个进程在运行中\n");
printf("主线程在运行中\n");
HANDLE hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
for(j=1;j<=20;j++){
printf("主线程正在运行第%d次;进程的ID号=%ld,线程ID号=%ld\n", j,GetCurrentProcessId(),GetCurrentThreadId());
Sleep(500); }
return 0; }
多次运行的结果显示,每次调度是不一样的,因为操作系统中程序并发运行时的异步性原则,进程ID、主线程ID和子线程ID每次也都是不一样的。

在上面实验的基础上,再创建一个子线程2,子线程2也如线程1一样输出,只是线程1改为线程2而已。

即,此时在计算机系统中形成主线程、线程1、线程2一起并发的阵势。

多运行几次,观察线程的调度情况,看看每次调度执行的结果一样不一样?
体会计算机系统中线程并发的异步性。

代码如下所示:
#include<stdio.h>
#include<afxmt.h>
DWORD WINAPI Thread1(LPVOID lpparameter){
int i;
for(i=1;i<=10;i++){
printf("子线程1在运行中,它正在运行第%d times,所属进程的ID 号=%ld,本线程的ID号=%ld\n",i,GetCurrentProcessId(),GetCurrentThreadId());
}
return 0;
}
DWORD WINAPI Thread2(LPVOID lpparameter){
int i;
for(i=1;i<=10;i++){
printf("子线程2在运行中,它正在运行第%d times,所属进程的ID 号=%ld,本线程的ID号=%ld\n",i,GetCurrentProcessId(),GetCurrentThreadId());
}
return 0;
}
int main(){
int j;
printf("一个进程在运行中\n");
printf("主线程在运行中\n");
HANDLE hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
HANDLE hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
for(j=1;j<=10;j++){
printf("主线程正在运行第%d次;进程的ID号=%ld,线程ID号=%ld\n", j,GetCurrentProcessId(),GetCurrentThreadId());
Sleep(500);
}
return 0;
}
多次运行的结果显示,每次调度执行是不一样的,因为计算机系统中线程运行时并发的异步性原则。

一个主线程一个子线程时,程序运行一次时,进程ID相同,主线程ID和子线程ID不相同,但是主线程无论允许多少次,主线程的ID都是一样的,子线程也是一样。

多运行几次程序时,每次的进程ID不相同。

一个主线程两
个子线程时,程序运行一次时,进程ID相同,主线程ID和子线程ID不相同,但是主线程无论允许多少次,主线程的ID都是一样的,两个子线程ID却不是一样的。

多运行几次程序时,每次的进程ID不相同。

相关主题