多线程是一个程序内部实现多任务的能力。程序可以把自己分割为单独的执行“线程”。一个线程简单地被表示为可能调用程序中其他函数的函数。程序从其他主线程开始执行,这个主线程是在传统的C程序中叫做“main ”的函数,而在Windows中是WinMain。一旦运行起来程序可以通过在系统调用CreatThread中指定初始线程函数的名称来创建新的线程的执行。
一个程序中的线程是同一进程的不同部分,因此他们共享进程的资源,如内存和打开的文件,因为线程共享的内存,所以他们还在共享静态变量。然而每个线程都有他们自己的堆栈,因此动态变量对每个线程是唯一的。每个线程还有他自己的处理器状态,这个状态在进行线程切换期间被保存和恢复。
创建新的执行线程的API函数是CreatThread。
---------------------------------------------------------------------------------------------------------------
它的语法如下:hThread = CreateThread(&security_attributes,dwStackSize,ThreadProc,pParam,dwFlags,&idThread);
第一个参数是指向SECURITY_ATTRIBUTES类型的结构的指针。
第二个参数用于新线程的初始堆栈大小。默认值为0。Windows根据需要动态延长堆栈的大小。
第三个参数是指向线程函数的指针。名称可以使任意的,但必须有如下语法:
DWORD WINAPI ThreadProc(PVOIO pParam)。
第四个参数为传递给ThreadProc的参数。这样主线程和次线程就可以共享数据。
第五个参数通常为0,但当创建的线程不马上执行时为标志CREATE_SUSPENDED。线程将刮起知道调用ResumeThread。
第六个参数是一个指针,指向接受线程ID的值的变量。
---------------------------------------------------------------------------------------------------
Win32 中CreateThread函数。
HANDLE CreateThread(lpsa,cbStack,lpStartAddr,lpvThreadParm,fdwCreate,lpIDThread)
LPSECURITY_ATTRIBUTES lpsa; //address of thread security attrs。
指向一个LPSECURITY_ATTRIBUTES结构,该结构为线程指定了安全属性。如果lpsa为NULL,则所创建的线程有一个缺省的安全描述符,且结构句柄不被继承。
DWORD cbStack; // 初始新线程的堆栈大小。以字节为单位为新线程指定堆栈的大小。如果指定该参数为0,则堆栈大小缺省为和该进程的大小相同。该堆栈被自动化地在此进程的内存空间中分配,且当线程终止时,该堆栈被释放。如果需要的话,堆栈的大小会增长。
LPTHREAD_START_ROUTINE lpStartAddr;//线程函数的地址。指向将该线程执行的、应用程序提供的函数,并且代表该线程的起始地址。该函数接受一个单个的32位自变量,并返回一个32位退出码。
LPVOID lpvThreadParm; //传递给线程的一个单个的32位参数。
DWORD fdwCreate; //Creation flags。指定控制线程的创建的附加标志。如果指定了CREATE_SUSPENDED标志,则该线程被创建在挂起状态,且知道调用ResumeThread函数才返回。如果该参数值为零,则该线程在创建后立即返回。
LPDWORD lpIDThread; //是一个指针,指向接受线程ID的值的变量。指向一个32位变量,它接受该线程的标识符。
该函数创建一个线程以在调用进程的地址空间执行。如果函数成功,返回值为新线程的句柄;否则返回值为NULL。可通过调用GetLastError函数得到进一步的错误信息。