1.1创建多线程的函数
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //新线程的Security属性,NULL表示缺省
DWORD dwStackSize, //线程拥有自身堆栈大小 0默认表示1M
LPTHREAD_START_ROUTINE lpStartAddress, //新线程开始地址,函数的指针
LPVOID lpParameter, //新线程的参数
DWORD dwCreateFlags, //开始标志,默认为立即开始
LPWORD lpThread //新的线程ID,不需要可传入为空
)
如果该函数调用成功则返回一个Handle,调用失败则返回FALSE,可用GetLastError()获取原因
当CreateThread函数被调用时,CreateThread开启一个新的线程,该线程调用线程函数(LPTHREAD_START_ROUTINE),而原来的线程继续进行,即线程函数被异步的执行
int main(int argc, char* argv[])
{
HANDLE hThread[10];
DWORD ThreadID[10];
for (int i=0; i<10; i++)
{
hThread[i] = CreateThread(0,0,ThreadFunc,&i,0,ThreadID);
}
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
int *m = (int *)n;
cout<<*m<<endl;
return 0;
}
线程函数必须有以下特点
1.返回值为DWORD,
2.调用约定为WINAPI //__stacall
3.参数有且只有一个,并且为LPVOID类型
注意:
线程执行的次序无法保证,线程之间执行的次序可看为随机
context Switches(线程切换??)可以在任何时刻发生
线程对于小的改变有很高的敏感,在抢先式多任务调度中,每个线程被允许一个固定的timeslice(时间片),然后控制权就会转移.
线程并不总是立即启动