典型mfc单文档框架程序,在MainFrame里做了1秒钟的定时器,并不断读串口数据,读到的串口数据保存到一个大约一个小时的缓冲区中,并把没有转发到网络的数据做标记FLAG = 1。另外开辟了一个工作者线程,用来把串口接受的数据转发到网络去,如果网络连接正常,马上就能把串
口缓冲区数据转发出去,即这样的情况下,串口缓冲区在网络转发后,结果始终保持空状态。如果网络断开,串口数据就就不断保存到缓冲区,当缓冲区溢出,把最旧的数据覆盖掉。当网络重新连接后,就从缓冲区取数发送,发送成功的数据也做标记FLAG = 0; 这样很快能把缓冲区数据转发出去。担心问题:这样俩个线程在改变FLAG的值,会不会有访问冲突,如果有,怎样来控制?如果没有,原因是什么?
谢谢各位!!
口缓冲区数据转发出去,即这样的情况下,串口缓冲区在网络转发后,结果始终保持空状态。如果网络断开,串口数据就就不断保存到缓冲区,当缓冲区溢出,把最旧的数据覆盖掉。当网络重新连接后,就从缓冲区取数发送,发送成功的数据也做标记FLAG = 0; 这样很快能把缓冲区数据转发出去。担心问题:这样俩个线程在改变FLAG的值,会不会有访问冲突,如果有,怎样来控制?如果没有,原因是什么?
谢谢各位!!
CCriticalSection m_csLock;
....
CSingleLock lock(&m_csLock,TRUE);
CRITICAL_SECTION g_cs;
// 共享资源
char g_cArray[10];
UINT ThreadProc10(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[i] = 'a';
Sleep(1);
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return 0;
}
UINT ThreadProc11(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[10 - i - 1] = 'b';
Sleep(1);
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return 0;
}
……
void CSample08View::OnCriticalSection()
{
// 初始化临界区
InitializeCriticalSection(&g_cs);
// 启动线程
AfxBeginThread(ThreadProc10, NULL);
AfxBeginThread(ThreadProc11, NULL);
// 等待计算完毕
Sleep(300);
// 报告计算结果
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
}