2024年4月29日发(作者:)

信息工程学院实验报告

成 绩:

指导老师(签名):

课程名称: 操作系统

实验项目名称: Windows中的线程与线程同步现象

一、实 验 目 的:

1、掌握Windows中线程的操作。

2、熟悉线程不同步时的现象及环境因素。

3、掌握一种同步对象的使用。

二、实 验 设 备 与 器 件

(填写使用的计算机配置、操作系统等实验所需的软硬件环境)

Visual C++

三、

实 验 内 容 与 步 骤

1、定义全局变量 int i = 0; 初始值置为 0。

2、创建两个线程,一个对 i 执行加 1 操作,另一个对 i 执行减 1 操作。两个线程执行相

同的次数。显然,正常情况下,i 的值仍然保持为 0。

#include

#include

#define MaxCount 9000000

DWORD __stdcall fun1( LPVOID p1)

{

}

DWORD __stdcall fun2( LPVOID p1)

{

for( int j =0 ;j < MaxCount;j++){

}

return 0;

i++;

for( int j =0 ;j < MaxCount;j++){

i--;

第 1 页 共 3 页

}

}

return 0;

3、观察两个线程执行后的情况,可以发觉最后 i 的值不一定是 0, 有时是很大的正数,有

时是很大的负数,这就是多个线程在操作同一个变量 i时,未同步时带来的严重问题。

因此,多个线程操作共享的变量时,需要考虑同步问题。

给这两个线程加上同步代码,再来观察对 i 值的影响。只要对步骤2的函数稍微改动即

可:

CRITICAL_SECTION cs;

DWORD __stdcall fun1( LPVOID p1)

{

for( int j =0 ;j < MaxCount;j++){

}

}

DWORD __stdcall fun2( LPVOID p1)

{

for( int j =0 ;j < MaxCount;j++){

}

}

加入同步代码的两个线程,无论如何执行,i 的值总是 0 ,结果是正确的。

主函数的写法:

int main()

{

::EnterCriticalSection(&cs);

i++;

::LeaveCriticalSection(&cs);

::EnterCriticalSection(&cs);

i--;

::LeaveCriticalSection(&cs);

DWORD id1,id2;

第 2 页 共 3 页