C++ 用于数据收集的环形缓冲区

C++ 用于数据收集的环形缓冲区,c++,visual-c++,mfc,C++,Visual C++,Mfc,我有一个环形缓冲区实现,我喜欢用它来处理传入的数据。考虑到需要同步,以下方法是否安全有效 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

我有一个环形缓冲区实现,我喜欢用它来处理传入的数据。考虑到需要同步,以下方法是否安全有效

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;
}
void CMyDlg::MyButton1()
{
环缓冲器布弗林(10000);
无符号字符InputBuf[100];
无符号字符f[100];
对于(int ii=0;ii<1000;++ii)
{
对于(int i=0;i<100;++i)
{
InputBuf[i]=i;
}
写入(InputBuf,100);
布弗林·里德(Expuf,100);
AfxBeginThread(WorkerThreadProc,EXPUF,线程优先级正常,0,0,NULL);
}
}
UINT WorkerThreadProc(LPVOID参数)
{
unsigned char*pThreadBuf=(unsigned char*)参数;
对于(int c=0;c<100;++c)
{
跟踪(“循环%d元素%x\n”,c,pThreadBuf[c]);
}
返回TRUE;
}

对我来说很危险

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);
    }
}
void CMyDlg::MyButton1()
{
// ...
无符号字符f[100];
对于(int ii=0;ii<1000;++ii)
{
// ...
布弗林·里德(Expuf,100);
AfxBeginThread(WorkerThreadProc,EXPUF,线程优先级正常,0,0,NULL);
}
}
我看到的问题是,您正在使用单个缓冲区(
exputf
)来存储数据,将其传递给工作线程,然后在循环的下一次迭代中修改相同的缓冲区


您的测试代码不会揭示这一点,因为您只是在每次迭代中用相同的值重新填充
exputf
(无论如何,据我所知)。如果您更改了
InputBuf[i]=i
输入buf[i]=ii并在
跟踪
输出中包含唯一的线程ID,您可能会看到可疑行为。

看起来对我很危险

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);
    }
}
void CMyDlg::MyButton1()
{
// ...
无符号字符f[100];
对于(int ii=0;ii<1000;++ii)
{
// ...
布弗林·里德(Expuf,100);
AfxBeginThread(WorkerThreadProc,EXPUF,线程优先级正常,0,0,NULL);
}
}
我看到的问题是,您正在使用单个缓冲区(
exputf
)来存储数据,将其传递给工作线程,然后在循环的下一次迭代中修改相同的缓冲区


您的测试代码不会揭示这一点,因为您只是在每次迭代中用相同的值重新填充
exputf
(无论如何,据我所知)。如果您更改了
InputBuf[i]=i
输入buf[i]=ii跟踪
输出中包含唯一的线程ID,您可能会看到可疑行为。

如果您展示了RingBuffer的实现,这个问题会更有意义。它包括内部同步吗?它是将输入缓冲区复制到自身中还是仅仅维护一个指向缓冲区的指针?如果您展示了RingBuffer的实现,这个问题将更有意义。它包括内部同步吗?它是将输入缓冲区复制到自身中,还是仅仅维护一个指向缓冲区的指针?尝试使用此方法时,遇到了此站点(使用优雅的代码):我分配了大缓冲区,然后尝试连续写入和读取100个字节。我可以看看改进后的版本吗?我尝试过使用这种方法,遇到了这个网站(代码优雅):我分配了大缓冲区,然后尝试连续写入和读取100字节。我可以看看改进后的版本吗。