1

着信データを処理するために使用したいリング バッファーの実装があります。必要な同期を考慮すると、次のアプローチは安全で効率的ですか?

void CMyDlg::MyButton1()
{
    RingBuffer BufRing(10000);

    unsigned char InputBuf[100];
    unsigned char OutBuf[100];

    for (int ii = 0; ii < 1000; ++ii)
    {
        for (int i = 0; i < 100; ++i)
        {
            InputBuf[i] = i;
        }

        BufRing.Write(InputBuf,100);

        BufRing.Read(OutBuf,100);
        AfxBeginThread(WorkerThreadProc,OutBuf,THREAD_PRIORITY_NORMAL,0,0,NULL);
    }
}

UINT WorkerThreadProc( LPVOID Param )
{
    unsigned char* pThreadBuf = (unsigned char*)Param;

    for (int c = 0; c < 100; ++c)
    {
        TRACE("Loop %d elemnt %x\n",c,pThreadBuf[c]);
    }


    return TRUE;
}
4

1 に答える 1

1

私には危険に見えます...

void CMyDlg::MyButton1()
{
    // ...
    unsigned char OutBuf[100];

    for (int ii = 0; ii < 1000; ++ii)
    {
        // ...

        BufRing.Read(OutBuf,100);
        AfxBeginThread(WorkerThreadProc,OutBuf,THREAD_PRIORITY_NORMAL,0,0,NULL);
    }
}

私が見ている問題は、データを格納するために単一のバッファー(OutBuf)を使用し、それをワーカースレッドに渡し、ループの次の反復で同じバッファーを変更していることです。

テストコードはこれを明らかにしません。なぜならOutBuf、すべての反復で同じ値を再入力しているだけだからです(とにかく、私が知る限り)。出力に変更InputBuf[i] = i;InputBuf[i] = ii;て一意のスレッドIDを含めた場合TRACE、疑わしい動作が見られる可能性があります。

于 2012-11-30T15:58:53.253 に答える