Как предоставить 64-битный идентификатор потока для _beginthreadex - PullRequest
2 голосов
/ 08 февраля 2012

Я пытаюсь перенести некоторый код на 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 , но не увидел 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 ]

5 голосов
/ 08 февраля 2012

Параметр thrdaddr получает идентификатор потока. Это не адрес функции потока. Похоже, что это чрезвычайно плохо названный параметр.

Параметр start_address является указателем на функцию потока, и вы можете передать свой 64-битный указатель на функцию в этом параметре.


Ваше обновление вопроса предполагает, что вы считаете, что идентификатор потока является 64-битным значением в 64-битной Windows. Это ошибочное мнение. Идентификаторы потоков являются 32-битными значениями во всех разновидностях Windows.

1 голос
/ 08 февраля 2012

Вы перепутали некоторые аргументы. Адрес для вашей ветки будет передан как start_address. thrdaddr - необязательный параметр, который получает идентификатор потока.

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
1 голос
/ 08 февраля 2012

Из документации :

Thrdaddr

Указывает на 32-битную переменную, которая получает идентификатор потока.Может быть NULL, в этом случае он не используется.

Другими словами, thrdaddr получает идентификатор потока.Это не адрес для потока.

В 64-битных все указатели являются 64-битными.Так что это просто работает.

...