Win32多线程程序设计学习笔记 1

来源:互联网 发布:3dsmax软件 编辑:程序博客网 时间:2024/04/28 20:44

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(时间片),然后控制权就会转移.

线程并不总是立即启动

原创粉丝点击