返回

剖析 _beginthread、_beginthreadex 与 CreateThread:Windows 线程创建之精髓

后端

导语

在计算机科学领域,线程是并发编程的基本单元,它允许一个程序同时执行多个任务。Windows 操作系统提供了多种创建线程的方法,其中 _beginthread、_beginthreadex 和 CreateThread 是最常用的三个函数。本文将深入剖析这三个函数,帮助开发者了解其异同,从而在多线程编程中做出明智的选择。

1. _beginthread

_beginthread 是 C++ 运行时库中用于创建线程的函数。其语法如下:

unsigned int _beginthread(void (*start_address)(void *), unsigned stack_size, void *arglist);
  • start_address:指向线程入口点的函数指针。
  • stack_size:指定线程栈的大小,单位为字节。
  • arglist:指向线程参数的指针。

_beginthread 的优点是易于使用,并且可以在没有显式调用线程同步原语的情况下创建线程。但是,它也有几个缺点:

  • 栈大小有限制: _beginthread 创建的线程栈大小有限,可能无法满足某些应用程序的需求。
  • 不支持线程属性: _beginthread 不支持设置线程属性,例如线程优先级和线程亲和性。

2. _beginthreadex

_beginthreadex 也是 C++ 运行时库中用于创建线程的函数。其语法与 _beginthread 类似,但提供了更多的功能:

unsigned int _beginthreadex(void *security, unsigned stack_size, unsigned (WINAPI *start_address)(void *), void *arglist, unsigned initflag, unsigned *thrdaddr);
  • security:用于线程安全检查的指针。
  • stack_size:指定线程栈的大小,单位为字节。
  • start_address:指向线程入口点的函数指针。
  • arglist:指向线程参数的指针。
  • initflag:指定线程的初始化标志,可以是 0(无初始化)或 CREATE_SUSPENDED(创建后立即挂起)。
  • thrdaddr:指向存储创建的线程句柄的指针。

_beginthreadex 的优点包括:

  • 支持更大的栈大小: _beginthreadex 允许创建更大栈大小的线程,从而满足某些应用程序的需求。
  • 支持线程属性: _beginthreadex 允许设置线程属性,例如线程优先级和线程亲和性。
  • 支持挂起线程: _beginthreadex 可以创建挂起的线程,这在某些情况下很有用。

3. CreateThread

CreateThread 是 Windows API 中用于创建线程的函数。其语法如下:

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
  • lpThreadAttributes:指向线程属性结构体的指针。
  • dwStackSize:指定线程栈的大小,单位为字节。
  • lpStartAddress:指向线程入口点的函数指针。
  • lpParameter:指向线程参数的指针。
  • dwCreationFlags:指定线程的创建标志,可以是 0(无特殊标志)、CREATE_SUSPENDED(创建后立即挂起)或其他标志。
  • lpThreadId:指向存储创建的线程句柄的指针。

CreateThread 是 Windows API 中最强大的线程创建函数,它提供了最广泛的功能:

  • 完全控制线程属性: CreateThread 允许设置任何线程属性,包括线程优先级、线程亲和性和线程栈大小。
  • 支持挂起线程: CreateThread 可以创建挂起的线程,这在某些情况下很有用。
  • 支持其他高级功能: CreateThread 支持其他高级功能,例如线程本地存储和线程池。

对比

下表对比了 _beginthread、_beginthreadex 和 CreateThread 的主要特点:

特征 _beginthread _beginthreadex CreateThread
易用性 较高 较高 较低
栈大小限制
线程属性支持 部分 完全
挂起线程支持
高级功能支持 部分 完全

总结

_beginthread、_beginthreadex 和 CreateThread 是 Windows 系统中创建线程的三种常用函数。_beginthread 易于使用,但功能有限。_beginthreadex 在 _beginthread 的基础上提供了更多功能,例如支持更大的栈大小和线程属性。CreateThread 是最强大的线程创建函数,它提供了完全控制线程属性和支持高级功能。

在实际应用中,开发者应根据具体需求选择合适的线程创建函数。对于简单且不需要高级功能的应用程序,_beginthread 是一个不错的选择。对于需要更大栈大小或线程属性的应用程序,_beginthreadex 更合适。对于需要完全控制线程属性或支持高级功能的应用程序,CreateThread 是最佳选择。