继续多线程的学习。
CreateThread 函数原型如下:
1 2 3 4 5 6 7 8 |
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes , DWORD dwStackSize , LPTHREAD_START_ROUTINE lpStartAddress , LPVOID lpParameter , DWORD dwCreationFlags , LPWORD lpThreadId ); |
参数解析:
lpThreadAttributes //指向SECURITY_ATTRIBUTES结构体的指针。可以为其传递NULL,让该线程使用默认的安全性。
dwStackSize //设置线程初始栈的大小,即线程可以将多少地址空间用于它自己的栈,以字节为单位。系统会把这个参数值四舍五入成为最接近的页面的大小。如果这个值为0,或者小于默认提交的大小,那么默认将使用与调用该函数的线程相同的栈空间大小。
lpStartAddress //指向应用程序定义的LPTHREAD_START_ROUTINE类型的函数指针,这个函数将由新线程执行,表明新线程的起始地址。main函数是主线程的入口函数,同样的地,新创建的线程也需要有一个入口函数,这个函数的地址就由此参数指定。这就要求必须在程序中定义一个函数作为新线程的入口函数,该函数名称任意,但是函数类型必须遵照下面的声明形式:
1 |
DWORD WINAPI ThreadProc(LPVOID lpParameter); //即新线程有一个LPVOID类型的参数,并且返回值为DWORD。 |
lpParameter //main函数可以接受命令行参数,同样我们可以通过这个参数给创建的新线程传递参数。该参数提供了一种将初始化值传递给线程函数的手段。这个参数的值既可以是一个数值,也可以是一个指向其他信息的指针。
dwCreationFlags //设置用于线程控制的附加标记。它可以是两值中的一个:CREATE_SUSPENDED 或 0.如果该值是CREATE_SUSPENDED,那么线程创建后处于暂停状态,直到程序调用了ResumeThread函数为止。如果该值是0,那么线程在创建之后就立即运行。
lpThreadId //这个参数是一个返回值,它指向一个变量,用来接收线程ID.当创建一个线程时,系统会为该线程分配一个ID。如果这个值为NULL,则表明不需要返回线程ID.
简单实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI Fun1Proc( LPVOID lpParameter ); int main() { HANDLE hThread1; hThread1 = CreateThread( NULL , 0 , Fun1Proc , NULL , 0 , NULL ); CloseHandle( hThread1 ); cout << "Main Thread is running.\n"; Sleep( 10 ); return 0; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { cout << "Thread1 is running." << endl; return 0; } |
模拟售票实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int index = 0; int tickets = 100; int main() { HANDLE hThread1; HANDLE hThread2; hThread1 = CreateThread( NULL , 0 , Fun1Proc , NULL , 0 , NULL ); hThread2 = CreateThread( NULL , 0 , Fun2Proc , NULL , 0 , NULL ); CloseHandle( hThread1 ); CloseHandle( hThread2 ); //cout << "Main Thread is running.\n"; Sleep( 4000 ); return 0; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { //cout << "Thread1 is running." << endl; while(1) { if(tickets > 0) { cout << "Thread1 sell ticket :" << tickets-- << endl; } else { break; } } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { //cout << "Thread2 is running." << endl; while(1) { if(tickets > 0) { cout << "Thread2 sell ticket :" << tickets-- << endl; } else { break; } } return 0; } |