如何为_beginthreadex提供64位线程标识符

时间:2012-02-08 17:16:18

标签: c++ multithreading concurrency 64-bit crt

我正在尝试将一些代码移植到64位,但似乎_beginthreadex中的地址标识符是unsigned int,这是32位而我无法从函数中传递/接收64位地址标识符:

uintptr_t _beginthreadex( // NATIVE CODE
   void *security,
   unsigned stack_size,
   unsigned ( __stdcall *start_address )( void * ),
   void *arglist,
   unsigned initflag,
   unsigned *thrdaddr // <-- 32-bit address
);

我检查了MSDN documentation,但我没有看到64位版本的功能。我是否包含错误的标头,每处理器标志或是否有其他方法来创建具有64位地址标识符的线程?

更新

文档指出thrdaddr参数是32位:

  

Thrdaddr

Points to a 32-bit variable that receives the thread identifier. Might be NULL, in which case it is not used.

3 个答案:

答案 0 :(得分:5)

thrdaddr参数接收线程ID。它不是线程函数的地址。它似乎是一个非常糟糕的参数。

start_address参数是线程函数指针,您可以在该参数中传递64位函数指针。


您对问题的更新表明您认为64位Windows上的线程ID是64位值。这是一种误解。所有Windows版本的线程ID都是32位值。

答案 1 :(得分:1)

来自documentation

  

Thrdaddr

     

指向接收线程标识符的32位变量。可能为NULL,在这种情况下不使用它。

换句话说,thrdaddr获取线程ID。它不是该主题的地址。

在64位中,所有指针都是64位。所以这才有用。

答案 2 :(得分:1)

你得到了一些混淆的论点。线程proc的地址将作为start_address传递。 thrdaddr是一个可选参数,而不是接收线程ID。

HANDLE hThread;
unsigned threadID;

hThread = (HANDLE)_beginthreadex(
    NULL,
    0,
    &YourThreadProc, // this is your thread procedure
    NULL,
    0,
    &threadID); // threadID will hold the ID of the new thread