0

ボタンを押してスレッドを実行するたびに、スレッドのアフィニティを特定のマスクに設定しようとしています。ウィンドウを開いた後に初めて実行すると機能しますが、その後は機能しません。ただし、私のOutputDebugStringコードは、変更されたことを示唆する出力を生成します。使ってみましCloseHandle()たが、効果はないようです。他に何かありますか?

void CSMPDemoDlg::OnBnClickedButton1()
{
    // Start thread
    DWORD_PTR affinityMask = (static_cast<DWORD_PTR>(1) << NumberOfCores ) - 1;

    HANDLE WorkThreadHandle = CreateThread(NULL, 0, WorkThread, &tp, 0, NULL);
    DWORD_PTR z = SetThreadAffinityMask(WorkThreadHandle, affinityMask);

    if (z!=0) {
        char bb[100];
        sprintf_s(bb, 100, "Affinity changed from %d to %d", z, affinityMask);
        OutputDebugString(bb);
    }
}    
4

1 に答える 1

3

したがって、次のようなものが必要です。

 static count = 0;
 DWORD_PTR affinityMask = (static_cast<DWORD_PTR>(1) << NumberOfCores ) - 1;
 affinityMask <<= ((count * numberOfCores)  % totalCores);

これは、グループ内の次のコア セットで実行されることを意味します。たとえば、最初のコアである 4 コアで実行すると、コア 0..3、次に 4..7、次に 8.. で実行されます。 11.

totalCoresが の倍数であると想定しているnumberofCoresため、16 個のコアと がある場合numberOfCores = 3、奇妙な結果が得られます。

于 2013-07-26T19:34:26.650 に答える