2

一部のコードを 64 ビットに移植しようとしていますが、スレッドアドレス識別子_beginthreadexが32 ビットであり、関数から64 ビットアドレスunsigned int識別子を送受信できないようです。

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 ビットであると記載されています。

スレダドル

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

3 に答える 3

5

パラメータはthrdaddrスレッド ID を受け取ります。スレッド関数のアドレスではありません。非常に悪い名前のパラメーターのようです。

パラメーターはスレッド関数ポインターであり、そのstart_addressパラメーターに 64 ビット関数ポインターを渡すことができます。


質問に対するあなたの更新は、スレッド ID が 64 ビット Windows の 64 ビット値であると信じていることを示唆しています。それは誤解です。スレッド ID は、Windows のすべてのフレーバーで 32 ビット値です。

于 2012-02-08T17:26:20.220 に答える
1

いくつかの議論が混同されています。スレッドプロシージャのアドレスは、として渡され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
于 2012-02-08T17:27:35.137 に答える
1

ドキュメントから:

スレダドル

スレッド識別子を受け取る 32 ビット変数を指します。NULL の可能性があり、その場合は使用されません。

つまり、thrdaddrスレッド ID を取得します。スレッドのアドレスではありません。

64 ビットでは、すべてのポインターが 64 ビットです。したがって、これは機能します。

于 2012-02-08T17:25:30.683 に答える