底层操作系统只允许将一个参数传递给线程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
);
因此,CRT 线程创建函数也只允许一个参数,尽管名称为arglist:
uintptr_t _beginthreadex(
void *security,
unsigned stack_size,
unsigned ( *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
);
鉴于这些限制,通常的约定是将指针传递给带有所有参数的结构/类。通常,在 C++ 中,创建一个静态函数作为线程处理程序并传递一个实例作为参数:
class Foo
{
int _someState;
int _otherState;
char _moreState[256];
unsigned DoWork();
static unsigned ThreadHandler(void*);
public:
void StartThread();
}
void Foo::StartThread()
{
_beginthreadex(..., Foo::ThreadHandler, this, ...);
}
unsigned Foo::ThreadHandler(void* arglist)
{
Foo* pFoo = (Foo*) arglist;
return pFoo->DoWork();
}
unsigned Foo::DoWork()
{
// do here all the thread work
}
这是一个相当常见的习惯用法,实际上它允许您根据需要向线程传递尽可能多的状态(=参数)。