2012-11-30 5 views
1

J'ai une implémentation Ring Buffer que j'aime utiliser pour traiter une donnée entrante. L'approche suivante est-elle sûre et efficace à utiliser, compte tenu des synchronisations nécessaires?RingBuffer pour la collecte de données

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

Cette question aurait plus de sens si vous montriez l'implémentation de RingBuffer. Inclut-il une synchronisation interne? Copie-t-il le tampon d'entrée sur lui-même ou maintient-il simplement un pointeur sur le tampon? –

Répondre

1

me dirait dangereux ...

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); 
    } 
} 

Le problème que je vois est que vous utilisez un seul tampon (OutBuf) pour stocker des données en passant à un thread de travail, puis en modifiant ce même tampon dans l'itération suivante de votre boucle.

Votre code de test ne le révélera pas, car vous êtes simplement en train de repeupler OutBuf avec les mêmes valeurs à chaque itération (pour autant que je sache, de toute façon). Si vous avez changé InputBuf[i] = i; en InputBuf[i] = ii; et inclus un ID de thread unique dans votre sortie TRACE, vous obtiendrez probablement un comportement suspect.

+0

essayé de pratiquer sur cette méthode, est tombé sur ce site (avec un code élégant): http://soundprogramming.net/programming_and_apis/creating_a_ring_buffer J'ai alloué un grand tampon puis essayé d'écrire et de lire consécutivement 100 octets. puis-je voir la version améliorée qui fonctionne. – user783927

Questions connexes