我有一个环形缓冲区实现,我喜欢用它来处理传入的数据。考虑到需要同步,以下方法使用安全有效吗?
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,则可能会看到可疑的行为。