2012-11-30 55 views
1

我有一個我喜歡用來處理傳入數據的環形緩衝區實現。考慮到需要同步的情況下,以下方法是否安全高效?用於數據收集的RingBuffer

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; 
} 
+0

,如果你表現出RingBuffer實行這個問題會更有意義。它是否包含內部同步?它是否將輸入緩衝區複製到自身中,或者簡單地維護一個指向緩衝區的指針? –

回答

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;幷包含在您TRACE輸出一個唯一的線程ID,你可能會看到可疑行爲。

+0

嘗試這種方法練習,遇到了這個網站(用優雅的代碼):http://soundprogramming.net/programming_and_apis/creating_a_ring_buffer我分配大的緩衝區,然後試着寫,連續讀取100個字節。我可以看到有效的改進版本嗎? – user783927