2.3 线程实验2---Windows下可创建的线程的数目的测试:
这里使用的是让测试线程睡眠100秒,如果用的是让测试进程进入死循环的方法,则会很快让系统僵掉。
/*测试程序3: 测试在Windows下最多可创建线程的数目. */ DWORD WINAPI threadWork(LPVOID threadNo) { DWORD result=0; while(runFlag) { Sleep(100000); } //Terminate return result; } void main(int argc,char* argv[]) { int count=0; DWORD targetThreadID; while(runFlag) { if(CreateThread(NULL,0,threadWork,NULL,0,&targetThreadID)==NULL) { runFlag=false; break; } else count++; printf(\,count); } Sleep(5000); printf(\,count); printf(\}
在Windows XP下(赛扬800MHZ,256M内存),在上述方式下,测得可创建的最多的线程数目为2030个.
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 测试结果: (如图2) 图2 2.5 几点说明: 2.5.1 主调用程序在结束时使用Sleep(5000)的意图在于:使得由它所产生的子线程可以在主进程结束之前,完成如资源释放一类的工作。 2.5.2 在随机线程产生测试程序中: 之所以采用在每个线程内部用 srand((unsigned int)time (NULL)); 去初始化每个线程,是为了使得所有的线程拥有自己的随机数种子,否则,如果是在主调用程序中去初始化随机数种子数,则所有的线程得到的随机数序列都是一样的,将无法产生随机效果。 3、应用及推广: 采用这种在Windows下利用控制台调用Windows API进行操作系统实验的方法,具有代码简洁,观察效果好与实现目标接近等优点。