0

スレッドのリストに格納するスレッドの ID を取得しようとしています。

longこれを行うには、スレッド ID を格納するへのポインターを使用してスレッドを起動します。スレッド ID は、スレッド関数が実行されるとすぐに保存する必要があります。ID が保存されると、起動機能を続行できるはずです。

このコードはデバッグ モードでのみ動作するように見えますが、リリース モードではハングします。Visual C++ 2008 Express を使用しています。

Windows XP で動作するコードが必要です。残念ながらGetThreadId、Windows Server 2003 以降でのみサポートされているため、単純に使用することはできません。

thread_wrapper* spawn_thread(void *entryPoint, void *params)
{
    thread_wrapper *newThread = calloc(1, sizeof(thread_wrapper));

    _beginthread(spawned_thread_wrapper_func, 0, &newThread->_win32ThreadID);

    while (newThread->_win32ThreadID == 0) ; // Hangs here in Release mode

    ... // Safely add thread to list using critical section

    return newThread;
}

void spawned_thread_wrapper_func(void *params)
{
    long *outThreadIDPtr = (long *)params;
    *outThreadIDPtr = GetCurrentThreadId();

    // spawn_thread function should now be able to add thread to list
    // but still hangs on while waiting loop in Release mode.
    // Works fine in Debug mode.

    ...
}

ここで何がうまくいかないのですか?

4

1 に答える 1