gpt4 book ai didi

c++ - RingBuffer 用于数据收集

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:17 26 4
gpt4 key购买 nike

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

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()
{
// ...
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,您可能会看到可疑行为。

关于c++ - RingBuffer 用于数据收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13648402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com