Windows线程(一)最简单的线程创建

版权声明:本文为博主原创文章,转载请注明原创链接! https://blog.csdn.net/qq_34706280/article/details/79331937

一段最简单的线程创建代码如下:

#include <stdio.h>
#include <Windows.h>

DWORD WINAPI ThreadFun(LPVOID pM)
{
    printf("子线程的线程ID号为:%d\n子线程输出Hello Thread\n", GetCurrentThreadId());
    return 0;
}

int main()
{
    HANDLE handle;
    printf("--------------------最简单的创建多线程实例--------------------\n");
    handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);

    WaitForSingleObject(handle, INFINITE);

    system("pause");

    return 0;
}

在WinDef.h文件中,有如下定义:#define WINAPI __stdcall
被__stdcall这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈。详见:

https://baike.baidu.com/item/__stdcall/9466040?fr=aladdin

在WTypes.h文件中有如下定义:typedef unsigned long DWORD;,即DWORD就是unsigned long

在WinDef.h文件中,有如下定义:typedef void far *LPVOID;,其中far在该文件中有如下描述:#define far,即far为NULL,具体用这样的方法来选择程序中的某部分是否编译。


GetCurrentThreadId在WinBase.h中有如下声明:

WINBASEAPI DWORD WINAPI GetCurrentThreadId(VOID);

其中WINBASEAPI 在WinBase.h中有如下描述:

#if !defined(_KERNEL32_)
#define WINBASEAPI DECLSPEC_IMPORT
#else
#define WINBASEAPI
#endif

其中DECLSPEC_IMPORT在WinBase.h中有如下描述:

#if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64)) && !defined(MIDL_PASS)
#define DECLSPEC_IMPORT __declspec(dllimport)
#else
#define DECLSPEC_IMPORT
#endif

WINBASEAPI __out_opt HANDLE WINAPI CreateThread
(
    __in_opt  LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in      SIZE_T dwStackSize,
    __in      LPTHREAD_START_ROUTINE lpStartAddress,
    __in_opt __deref __drv_aliasesMem LPVOID lpParameter,
    __in      DWORD dwCreationFlags,
    __out_opt LPDWORD lpThreadId
);

第一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个参数表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个参数是传给线程函数的参数。
第五个参数指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL。
函数说明:
创建一个线程。
语法:
hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
一般并不推荐使用 CreateThread函数,而推荐使用RTL库里的System单元中定义的 BeginThread函数,因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
在MFC程序中,应该调用AfxBeginThread函数,在Visual C++程序中应调用_beginthreadex函数。


WaitForSingleObject函数详见下文:

https://baike.baidu.com/item/WaitForSingleObject/3534838?fr=aladdin


以上代码在Visual Studio 2010中运行结果如下:
这里写图片描述
参考文献:http://blog.csdn.net/morewindows/article/details/7421759

猜你喜欢

转载自blog.csdn.net/qq_34706280/article/details/79331937
今日推荐