首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于数据收集的RingBuffer

用于数据收集的RingBuffer
EN

Stack Overflow用户
提问于 2012-11-30 23:43:35
回答 1查看 283关注 0票数 1

我有一个Ring Buffer实现,我喜欢用它来处理传入的数据。考虑到需要同步,使用以下方法安全有效吗?

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2012-11-30 23:58:53

对我来说很危险..。

代码语言:javascript
复制
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,您可能会看到可疑的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13648402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档