C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序
MSDN中CreateThread原型:
1
2
3
4
5
6
7
8
|
HANDLECreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,
//SD
SIZE_TdwStackSize,
//initialstacksize
LPTHREAD_START_ROUTINElpStartAddress,
//threadfunction
LPVOIDlpParameter,
//threadargument
DWORDdwCreationFlags,
//creationoption
LPDWORDlpThreadId
//threadidentifier
);
参数的意义:
1 lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。
在Windows NT中,NULL使用默认安全性,不可以被子线程继承,
否则需要定义一个结构体将
它的bInheritHandle成员初始化为TRUE
2 dwStackSize,设置初始栈的大小,以字节为单位,如果为0,
那么默认将使用与调用该函数的线程相同的栈空间大小。
任何情况下 Windows根据需要动态延长堆栈的大小。
3 lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
也可以直接调用void类型
但lpStartAddress要这样通过LPTHREAD_START_ROUTINE转换如:
(LPTHREAD_START_ROUTINE)MyVoid
然后在线程声明为:
void MyVoid()
{
return;
}
4 lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
5 dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
(2)0:表示创建后立即激活。
(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):
dwStackSize参数指定初始的保留堆栈的大小,
否则,dwStackSize指定提交的大小。该标记值在
Windows 2000/NT and Windows Me/98/95上不支持。
|
6
lpThreadId:保存新线程的id。
返回值:
函数成功,返回线程句柄;函数失败返回false。
若不想返回线程ID,设置值为NULL。
函数说明:
创建一个线程。
语法:
hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
一般并不推荐使用 CreateThread函数,而推荐使用RTL
库里的System单元中定义的 BeginThread函数,因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
在MFC程序中,应该调用AfxBeginThread函数,在
Visual C++程序中应调用_beginthreadex函数。
一个简单的线程例子:
// NamespaceTest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" DWORD WINAPI Fun(LPVOID lpParamter) { while(1) { printf("hello\n"); Sleep(1000); } } int _tmain(int argc, _TCHAR* argv[]) { HANDLE hTread = CreateThread(NULL,0,Fun,NULL,0,NULL); CloseHandle(hTread); while(1) { printf("wang wang \n"); Sleep(100); } return 0; }