Глядя на сигнатуры функций, CreateThread
практически идентичен _beginthreadex
.
_beginthread
, _beginthreadx
против CreateThread
HANDLE WINAPI CreateThread(
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in_opt LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);
uintptr_t _beginthread(
void( *start_address )( void * ),
unsigned stack_size,
void *arglist
);
uintptr_t _beginthreadex(
void *security,
unsigned stack_size,
unsigned ( *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
);
Замечания по здесь скажем _beginthread
могут использовать либо __cdecl
, либо __clrcall
соглашение о вызовах в качестве начальной точки, а _beginthreadex
может использовать либо __stdcall
, либо __clrcall
в качестве начальной точки. .
Я думаю, что любые комментарии, сделанные людьми по поводу утечек памяти в CreateThread
, старше 10 лет и, вероятно, их следует игнорировать.
Интересно, что обе функции _beginthread*
на самом деле вызывают CreateThread
под капотом, в C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src
на моей машине.
// From ~line 180 of beginthreadex.c
/*
* Create the new thread using the parameters supplied by the caller.
*/
if ( (thdl = (uintptr_t)
CreateThread( (LPSECURITY_ATTRIBUTES)security,
stacksize,
_threadstartex,
(LPVOID)ptd,
createflag,
(LPDWORD)thrdaddr))
== (uintptr_t)0 )
{
err = GetLastError();
goto error_return;
}