典型mfc单文档框架程序,在MainFrame里做了1秒钟的定时器,并不断读串口数据,读到的串口数据保存到一个大约一个小时的缓冲区中,并把没有转发到网络的数据做标记FLAG = 1。另外开辟了一个工作者线程,用来把串口接受的数据转发到网络去,如果网络连接正常,马上就能把串
口缓冲区数据转发出去,即这样的情况下,串口缓冲区在网络转发后,结果始终保持空状态。如果网络断开,串口数据就就不断保存到缓冲区,当缓冲区溢出,把最旧的数据覆盖掉。当网络重新连接后,就从缓冲区取数发送,发送成功的数据也做标记FLAG = 0; 这样很快能把缓冲区数据转发出去。担心问题:这样俩个线程在改变FLAG的值,会不会有访问冲突,如果有,怎样来控制?如果没有,原因是什么?
谢谢各位!!

解决方案 »

  1.   

    使用临界区保护。每秒查询一次的话,一小时的数据应该没问题。
    CCriticalSection m_csLock;
    ....
    CSingleLock lock(&m_csLock,TRUE);
      

  2.   

    同进程可以使用使用 CCriticalSection 类来控制
      

  3.   

    // 临界区结构对象
    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);
    }