B
がResumeThread
を呼び出すと、変数C
に初期化されていない値が含まれている可能性があります。
ただし、コードが機能しない現在の理由は、GetCurrentThread
が擬似スレッドハンドルを返すだけで、現在のスレッドハンドルを意味する値として解釈されます。他のスレッドから実際に使用できるものを得るには、最初のCreateThread
呼び出しの戻り値から取り出すか、DuplicateHandle
で疑似ハンドルを変換します。
編集:方法1使用:実際には
HANDLE C;
DWORD WINAPI A (LPVOID in)
{
cout << "1";
SuspendThread (C);
cout << "4";
return 0;
}
DWORD WINAPI B (LPVOID in)
{
Sleep (200);
cout << "2";
ResumeThread ((HANDLE)in);
cout << "3";
return 0;
}
int main()
{
C = CreateThread (NULL, 0, A, NULL, 0, NULL);
CreateThread (NULL, 0, B, (LPVOID)C, 0, NULL);
Sleep (INFINITE);
return 0;
}
はハンドルが、彼らは閉鎖されるべき時に無視されているCreateThread
から返されたということであるあなたのコードを持つ別の問題があります。また、エラーチェックの欠如がありますが、私はあなたが簡潔さのために省略したと仮定しています。
また、コンテキストのタイミングに応じて、ことに注意が出力する上記のコードのために実際に可能で切り替える必要があります。
方法2を使用して:
HANDLE C = NULL;
DWORD WINAPI A (LPVOID in)
{
C = GetCurrentThread();
DuplicateHandle(GetCurrentProcess(), C, GetCurrentProcess(), &C, 0, FALSE, DUPLICATE_SAME_ACCESS);
cout << "1";
SuspendThread (C);
cout << "4";
return 0;
}
DWORD WINAPI B (LPVOID in)
{
Sleep (200);
cout << "2";
while(C == NULL) {
Sleep(100);
}
ResumeThread(C);
cout << "3";
return 0;
}
int main()
{
CreateThread (NULL, 0, A, NULL, 0, NULL);
CreateThread (NULL, 0, B, NULL, 0, NULL);
Sleep (INFINITE);
return 0;
}
を
実際、私はCがDebugを使って初期化されていると確信しています。 – xucheng
更新:あなたの方法で値を再チェックします。そして、私は 'GetCurrentThread'が値を返したが、間違っていることがわかりました。しかし、なぜですか? 'CreateThread'を使用できない場合はどうすれば正しい価値を得ることができますか – xucheng
それは私と一緒に働きます。どうも – xucheng