createthread
函数原型:
handle CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpparameter,
Dword dwCreationFlags,
LPdword lpThreadId
);
参数说明:
lpThreadAttributes
指向SECURITY_ATTRIBUTES 结构的指针,该结构确定子进程是否可以继承返回的句柄。如果 lpThreadAttributes为NULL,则无法继承句柄。
结构的lpSecurityDescriptor成员为新线程指定安全描述符。如果lpThreadAttributes为NULL,则线程获取默认安全描述符。
dwStackSize
线程堆栈的初始大小,以字节为单位。如果此参数为零,则新线程使用可执行文件的默认大小。
lpStartAddress
指向由线程执行的应用程序定义函数的指针。该指针表示线程的起始地址。
lpParameter
要传递给新建线程的命令行参数。
dwCreationFlags
控制线程创建的标志。
值 | 含义 |
---|---|
0 |
该线程在创建后立即运行。 |
CREATE_SUSPENDED 0x00000004 |
线程是在挂起状态下创建的,并且在调用ResumeThread函数之前不会运行 。 |
STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000在 |
所述dwStackSize参数指定堆栈的初始保留大小。如果未指定此标志,则dwStackSize指定提交大小。 |
lpThreadId
指向新建线程的ID号。如果此参数为 NULL,则不返回线程标识符。
代码实例:
// CreateThread.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iOStream>
#include <windows.h>
using namespace std;
DWORD WINAPI Fun1( LPVOID lpParam );
DWORD WINAPI Fun2( LPVOID lpParam ); //必须加参数,否则创建线程失败。提示无法将参数 3 从“DWORD (__stdcall *)(void)”转换为“LPTHREAD_START_ROUTINE”
int main()
{
HANDLE h1 = CreateThread( NULL, 0, Fun1, NULL, 0, NULL );
cout << "Thread1 create." << endl;
HANDLE h2 = CreateThread( NULL, 0, Fun2, NULL, 0, NULL );
cout << "Thread2 create." << endl;
while( 1 )
{
if( getchar() == 'q' )
{
CloseHandle( h1 );//不会直接关闭线程,只是递减线程中的内核对象使用计数。当使用计数为0时,释放内核对象
CloseHandle( h2 );
return 0;
}
else
{
Sleep( 1000 );
}
}
system( "pause" );
return 0;
}
DWORD WINAPI Fun1( LPVOID lpParam )
{
while( 1 )
{
cout << "Thread1 is running." << endl;
Sleep( 900 ); //暂停当前线程,从等待的线程中执行
}
return 0;
}
DWORD WINAPI Fun2( LPVOID lpParam )
{
while( 1 )
{
cout << "Thread2 is running." << endl;
Sleep( 900 );
}
return 0;
}
结果说明:
运行后可知,线程的运行结果并没有按照代码的顺序而执行,这就涉及到后面的线程同步了。
文章最后发布于: 2018-08-19 12:40:00
相关阅读
采用CreateThread()创建多线程程序在window环境下,Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工