2012-01-03 9 views
4

Win32ではSuspend(GetCurrentThread());を使用してスレッドを中断したいのですが、私はResumeThread(suspend thread handle);を使用して再開できません。Win32は自己を中断するスレッドを再開できません

ここは私のコードです。

HANDLE C; 
DWORD WINAPI A (LPVOID in) 
{ 
    C = GetCurrentThread(); 
    cout << "1"; 
    SuspendThread (C); 
    cout << "4"; 
    return 0; 
} 
DWORD WINAPI B (LPVOID in) 
{ 
    Sleep (200); 
    cout << "2"; 
    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; 
} 

そして、私は、画面上の取得すべてが123です。

答えて

2

BResumeThreadを呼び出すと、変数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; 
} 
+0

実際、私はCがDebugを使って初期化されていると確信しています。 – xucheng

+0

更新:あなたの方法で値を再チェックします。そして、私は 'GetCurrentThread'が値を返したが、間違っていることがわかりました。しかし、なぜですか? 'CreateThread'を使用できない場合はどうすれば正しい価値を得ることができますか – xucheng

+0

それは私と一緒に働きます。どうも – xucheng

関連する問題