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 页
发布评论