0

EnterCriticalSection() が対処できるスレッド制限はありますか? 次のコードは 64 スレッドで正常に動作しますが、65 以上を使用するとクラッシュします。

CRITICAL_SECTION TestCritSection;

unsigned int threadId;

int getThreadId()
{
    int tid = -1;

    EnterCriticalSection(&TestCritSection);

    tid= threadId;
    threadId++;

    LeaveCriticalSection(&TestCritSection);

    return tid;
}

void parallelTest()
{
    int tid = getThreadId();
    cout << "Thread " << tid << " executed" << endl;
}


void
multiThreadTest()
{
    unsigned int numThreads = 64; // fine, but program crashes when numThreads is set to 65 or more
    HANDLE *threads = new HANDLE[numThreads];
    DWORD ThreadID;
    threadId = 1;

    if (!InitializeCriticalSectionAndSpinCount(&TestCritSection, 0x00000400)) return;

    for (int i=0; i<numThreads; ++i)
    {
        threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) parallelTest, (LPVOID) NULL, 0, &ThreadID);
    }

    WaitForMultipleObjects(numThreads, threads, TRUE, INFINITE);

    DeleteCriticalSection(&TestCritSection);

    for (int i=0; i<numThreads; ++i)
    {
        CloseHandle(threads[i]);
    }

    delete [] threads;
}

CRITICAL_SECTION は内部で最大カウント 64 のセマフォを使用していると思います。どうにかしてそれを変更できますか?

4

1 に答える 1

1

誰も私の質問に答えたくないので、私の質問に対する HansPassant のコメントに基づいて自分で答えます。

WaitForMultipleObjects()彼は、問題はパラメータを取る であると指摘しました

nCount [インチ]

The number of object handles in the array pointed to by lpHandles.

オブジェクト ハンドルの最大数は MAXIMUM_WAIT_OBJECTS です。このパラメーターをゼロにすることはできません。

( msdnから)

MAXIMUM_WAIT_OBJECTSは 64 と定義されています。詳細については、このスレッドを参照してください。

つまり、はい、スレッドの量にはハードコーディングされた制限がありますが、制限は onではEnterCriticalSectionなく onWaitForMultipleObjectsであり、チェックする必要があったエラー コードを返します。

ここでは、64 を超えるスレッドを並行して動作させる方法について詳しく説明します。

于 2012-06-26T10:13:33.180 に答える