2.4 线程实验3---最简单的一个临界资源的读者,写者程序.
这个程序要实现的是最简单的读者,写者程序,读者将1~10十个数字依次填入临界资源区gData,当且仅当gData被读者消费后,写者才可以写入下一个数.
/*测试程序4:
最简单的一个临界资源的读者,写者程序.
*/
DWORD WINAPI threadReader(LPVOID lpvoid)
{
int reader_Data;
int busyTime=10000;
float tmp;
int i;
while(gRunFlag)
{
while(stateFlag==WRITER_FLAG)
for(i=0;i<busyTime;i++)
tmp=pow(2,10);
reader_Data=gData;
printf("reader gets data:%d\n",gData);
stateFlag=WRITER_FLAG;
}
printf("reader ends\n");
return NULL;
}
DWORD WINAPI threadWriter(LPVOID lpvoid)
{
int upTime=((INTEGER*)lpvoid)->mInt;
int busyTime=10000;
float tmp;
int i;
while(gRunFlag)
{
while(stateFlag==READER_FLAG)
for(i=0;i<busyTime;i++)
tmp=pow(2,10);
gData++;
printf("writer gets data:%d\n",gData);
if(gData==upTime)
gRunFlag=false;
stateFlag=READER_FLAG;
}
printf("writer ends\n");
return NULL;
}
/*Main 中的调用*/
……
CreateThread(NULL,0,threadReader,tmpInt,0,&targetThreadID);
CreateThread(NULL,0,threadWriter,tmpInt,0,&targetThreadID);
……
测试结果: (如图2)

图2
2.5 几点说明:
2.5.1 主调用程序在结束时使用Sleep(5000)的意图在于:使得由它所产生的子线程可以在主进程结束之前,完成如资源释放一类的工作。
2.5.2 在随机线程产生测试程序中:
之所以采用在每个线程内部用
srand((unsigned int)time (NULL));
去初始化每个线程,是为了使得所有的线程拥有自己的随机数种子,否则,如果是在主调用程序中去初始化随机数种子数,则所有的线程得到的随机数序列都是一样的,将无法产生随机效果。
3、应用及推广:
采用这种在Windows下利用控制台调用Windows API进行操作系统实验的方法,具有代码简洁,观察效果好与实现目标接近等优点。
