1

私はしばらくの間私を悩ませてきた問題を抱えています。私のプロジェクトの各子スレッドは正しく実行されており、87 に設定された Last Error でスレッドを開始することを除いて、想定されていることを実行しています。

87 は、Win32 システム エラーによる無効なパラメータを意味します。LastError はスレッド固有であり、ThreadProc 関数の最初の行から設定されているように見えるため、推測できる唯一のことは、ThreadProc 関数自体が何らかの形で構文的に間違っている (?) ことです。

私の OS は Windows 7 x64 で、コンパイラは gcc バージョン 4.6.2 です。私のシステムでエラー 87 が設定された状態で子スレッドを開始する小さなサンプル プログラムを作成しました。

#include <windows.h>

DWORD WINAPI THREAD_FUNCTION(LPVOID t)
{
    printf("In the child thread: Last Error is %lu\n",GetLastError());
    return 0;
}

typedef struct thread_data
{
    //just an id for example's sake
    uint32_t id;
}thread_data;

int main()
{
    HANDLE thread;
    thread_data d;
    d.id = 1;
    printf("Main thread start:Last error is %lu\n",GetLastError());
    //create the thread
    thread = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE) THREAD_FUNCTION,(LPVOID)&d,0, NULL);
    //wait for it
    WaitForSingleObject(thread,INFINITE);
    CloseHandle(thread);
    printf("Main thread finish: Last error is %lu\n",GetLastError());
    return 0;
}

これは以下を出力します:

Main thread start:Last error is 0
In the thread: Last Error is 87
Main thread finish: Last error is 0

スレッドを呼び出してデータを渡す方法のエラーだと思いますが、ドキュメントを読んでもこのエラーを推測することはできません。何か案は?

4

2 に答える 2

5

あなたの例の戻り値GetLastError()は無意味です。呼び出しGetLastError()は、最後のエラー値を設定する Windows API 関数を呼び出した直後にのみ有効です (特定の関数がそうするかどうかについては、MSDN のドキュメントを参照してください)。

スレッド ルーチンではGetLastError()、それを設定する Windows API 関数を呼び出さずに呼び出しているため、その戻り値はコードが引き起こしたエラーを反映していないため、何の意味もありません。

新しく開始されたスレッドの are の値GetLastError()が完全に無意味である可能性があります。つまり、87 に設定されているのはランダムです。87 エラーを生成するスレッドのセットアップ中に実行されるコードがある可能性が高くなります。このコードが Visual Studio でビルドされたか、別のバージョンの Windows で実行された場合、異なる値が得られる可能性があります。しかし、それが何であれ、それはあなたがコントロールしたり頼ったりできるものではなく、気にする必要さえありません.

于 2012-06-07T05:48:47.913 に答える
3

最後に呼び出された関数がエラーを返した場合にのみ、最後のエラーが信頼できることを覚えておく必要があります。

于 2012-06-07T05:48:50.937 に答える