LPVOID lpParameter,//argument for new thread DWORD dwCreationFlags,//creation flags LPDWORD lpThreadId //pointer to returned thread identifier )
其中,在本实验阶段比较重要的参数是第三和第四个:
a)第三个参数是一个指向函数的指针,所以应传入的参数应为函数的地址,如&Func的形式.而这个传入的参数,则必须被声明成为:
DWORD WINAPI threadFunc(LPVOID threadArgu);
的形式.这个函数也就是要执行线程任务的那个函数体实体.这里应注意,传入应使用Func而非&Func。
如:CreateThread(NULL,0,Func,…)
具体原因:我目前认为是系函数前部使用WINAPI所致。
b)第四个参数应是执行线程任务的函数体实体所需要的参数,即上面所举例的函数threadFunc的参数threadArgu,这在WINDOWS中被定义成一个LPVOID的类型,目前我认为,可以把它在功能上看成和void* 类似。
参考:LPVOID的原型:
typedef void far *LPVOID;
所以,当你有自己需要的类型的参数传入时,可以用
typedef struct { int firstArgu, long secArgu, … }myType,* pMyType;
将你想要传入的参数装入一个结构体中。
在传入点,使用类似:
pMyType pMyTpeyArgu; … CreateThread(NULL,0,threadFunc,pMyTypeArgu,…); …
在函数threadFunc内部的接收点,可以使用“强行转换”,如:
int intValue=((pMyType)lpvoid)->firstArgu; long longValue=((pMyType)lpvoid)->secArgu; … …
2.2 线程实验1---创建N个随机线程,所有线程的执行时间均为T秒,观察每个线程的运行状况:
为了使线程的运行趋于随机化,应先使用:
srand((unsigned int)time (NULL));
在每个线程的运行中,每个线程的睡眠时间为:
sleepTime=1000+30*(int)eRandom(50+tNo); Sleep(sleepTime);
这样,可以使进程的运行趋于随机化.
/*测试程序2:
创建N个随机线程的随机实验.
命令行输入参数:
test threadNo runSecs */ #include #include #include #include #include #define N 5 #define Type float static int runFlag=TRUE; DWORD WINAPI threadWork(LPVOID threadNo); int parseArgToInt(char* inNumChar); Type eRandom(int upLimit); typedef struct { int data; }INTEGER; void main(int argc,char* argv[]) { unsigned int runTime; int i; int threadNum; //int N; SYSTEMTIME now; WORD stopTimeMinute,stopTimeSecond; DWORD targetThreadID; //Get command line argument,N if(argc!=3) { printf(\ return; } threadNum=parseArgToInt(argv[1]); runTime=parseArgToInt(argv[2]); //Get the time the threads should run,runtime //Calculate time to halt // runTime=60;/*in seconds.*/ GetSystemTime(&now); printf(\,%d,%d\\n\,now.wHour,now.wMinute,now.wSecond); stopTimeSecond=(now.wSecond+(WORD)runTime)`; stopTimeMinute=now.wMinute+(now.wSecond+(WORD)runTime)/60; //FOR 1 TO N INTEGER* tmpInt; for(i=0;idata=i; CreateThread(NULL,0,threadWork,tmpInt,0,&targetThreadID); Sleep(100);//Let newly created thread run } //Cycle while children work... while(runFlag) { GetSystemTime(&now); if((now.wMinute>=stopTimeMinute)&&(now.wSecond>=stopTimeSecond)) runFlag=FALSE; Sleep(1000); } Sleep(5000); printf(\} DWORD WINAPI threadWork(LPVOID threadNo) { //local variables double y; const double x=3.14159; const double e=2.7183; int i; const int napTime=1000;//in milliseconds const int busyTime=400; int tNo=((INTEGER*)threadNo)->data; int sleepTime; DWORD result=0; /*randomasize the random num seeds.*/ srand((unsigned int)time (NULL)); while(runFlag) { //Parameterized processor burst phase for(i=0;i='0'&&inNumChar[i]<='9') { equipData=10*equipData+(inNumChar[i]-48); i++; } return equipData; } Type eRandom(int upLimit) { Type tmpData; do { tmpData=((Type)rand()/(Type)32767)*(Type)100.0*(Type)upLimit; } while(tmpData>upLimit); return tmpData; }