实验四操作系统中的线程同步一、实验目的1、加深对线程的理解、掌握Windows中线程的操作。2、掌握信号量、互斥量、事件、临界区等同步对象的使用。二、实验理论基础及教材对应关系1、进程和线程的关系。2、线程间的同步和通信。3、本实验内容主要对应于教材中关于线程、死锁的各节。三、实验内容与步骤1、定义全局变量inti=0;初始值置为0。2、创建两个线程,一个对i执行加1操作,另一个对i执行减1操作。两个线程执行相同的次数。显然,正常情况下,i的仍然保持为0。#includestdio.h#includewindows.h#defineMaxCount9000000//循环次数要很大,可多次尝试一些值DWORD__stdcallfun1(LPVOIDp1){for(intj=0;jMaxCount;j++){i++;}return0;}DWORD__stdcallfun2(LPVOIDp1){for(intj=0;jMaxCount;j++){i--;}return0;}3、观察两个线程执行后的情况,可以发觉最后i的值不一定是0,有时是很大的正数,有时是很大的负数,这就是多个线程在操作同一个变量i时,未同步时带来的严重问题。还应该了解,在多个线程操作共享的变量时,才需要考虑同步问题。代码如下:#includestdio.h#includewindows.h#defineMaxCount9000000CRITICAL_SECTIONcs;inti=0;DWORD__stdcallfun1(LPVOIDp1){for(intj=0;jMaxCount;j++){i++;}return0;}DWORD__stdcallfun2(LPVOIDp1){for(intj=0;jMaxCount;j++){i--;}return0;}intmain(){DWORDid1,id2;HANDLEhThread[2];::InitializeCriticalSection(&cs);hThread[0]=::CreateThread(0,0,fun1,0,0,&id1);hThread[1]=::CreateThread(0,0,fun2,0,0,&id2);::WaitForMultipleObjects(2,hThread,1,INFINITE);printf(i=%d\n,i);::DeleteCriticalSection(&cs);getchar();return0;}4、给这两个线程加上同步代码,再来观察对i值的影响。步骤2的函数稍微改动即可:CRITICAL_SECTIONcs;DWORD__stdcallfun1(LPVOIDp1){for(intj=0;jMaxCount;j++){::EnterCriticalSection(&cs);i++;::LeaveCriticalSection(&cs);}}DWORD__stdcallfun2(LPVOIDp1){for(intj=0;jMaxCount;j++){::EnterCriticalSection(&cs);i--;::LeaveCriticalSection(&cs);}}加入的同步代码的两个线程,无论如何执行,i的值总是0,结果是正确的。1、主函数的写法intmain(){DWORDid1,id2;HANDLEhThread[2];::InitializeCriticalSection(&cs);hThread[0]=::CreateThread(0,0,fun1,0,0,&id1);hThread[1]=::CreateThread(0,0,fun2,0,0,&id2);::WaitForMultipleObjects(2,hThread,1,INFINITE);printf(i=%d\n,i);::DeleteCriticalSection(&cs);getchar();return0;}改动后代码如下:#includestdio.h#includewindows.h#defineMaxCount9000000CRITICAL_SECTIONcs;inti=0;DWORD__stdcallfun1(LPVOIDp1){for(intj=0;jMaxCount;j++){::EnterCriticalSection(&cs);i++;::LeaveCriticalSection(&cs);}}DWORD__stdcallfun2(LPVOIDp1){for(intj=0;jMaxCount;j++){::EnterCriticalSection(&cs);i--;::LeaveCriticalSection(&cs);}}intmain(){DWORDid1,id2;HANDLEhThread[2];::InitializeCriticalSection(&cs);hThread[0]=::CreateThread(0,0,fun1,0,0,&id1);hThread[1]=::CreateThread(0,0,fun2,0,0,&id2);::WaitForMultipleObjects(2,hThread,1,INFINITE);printf(i=%d\n,i);::DeleteCriticalSection(&cs);getchar();return0;}