2、Windows线程的创建及实验:
2.1 使用CreateThread在Windows下创建线程:
在Windows中创建线程可以调用两个函数_beginthreadex和CreateThread两个函数,这里只介绍后者。
CreateThread函数原型:
HANDLE CreateThread
(LPSECURITY_ATTRIBUTES lpThreadAttributes,//pointer to thread security attributes
DWORD dwStackSize,//initial thread stack size, in bytes
LPSECURITY_START_ROUTINE lpStartAddress,//pointer to thread function
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);
这样,可以使进程的运行趋于随机化.
