同一时间只有一个线程对全局变量读和写,不存在同步的问题,主要是线程不安全,会突然改变全局变量的值,我的全局变量是个数组,每个数组的元素又是一个结构,偶尔会把整个数组当中某一两个无素的成员改变成古怪的值,大概30次里有1.2次的样子.

解决方案 »

  1.   

    这不是MFC安全不安全的问题,而是你自己用对没有的问题。几个问题要问问自己:1. 多线程访问同一个对象时,是不是没有做正确做并发控制(俗称锁)技术?!
    2. 有没有把CWnd或者它的派生类对象跨线程使用?
    3. 是不是把COM对象跨套间使用
    4. 是不是有内存访问越界如果你上述都没有,那么你的程序应该安全的。
      

  2.   

    首先,你使用全局变量的时候加锁了么?如果没有,不要抱怨微软,微软做Windows的时候不知道你要用那个全局变量,无法为你保证你想要的线程安全
      

  3.   

    程序中调用了一个全局函数,调用前不出错,调用后就出错,但函数中并非对它进行操作,只是用了它的一个拷贝,定义一个临时变量,用memcpy给它的。
      

  4.   


    //这时候dev_info的值没有错。
    for (i=m_Dev_count-r; i < m_Dev_count; i++)
    {
    memcpy(MacAdrs,dev_info[i].hw_info.mac_adrs,6);

    nIpAddr=GetIPAddress98();//全局函数

    char ipsz[100] = {0};
    sprintf(ipsz,"%d.%d.%d.%d",nIpAddr>>24,(nIpAddr>>16)&0xFF,(nIpAddr>>8)&0xFF,nIpAddr&0xFF);
    m_devList.SetItemText(i,2,ipsz);
    cr = m_devList.SetTextBkColor(CLR_INVALID);
    ASSERT(cr!=CLR_INVALID);

    m_devList.SetTextBkColor(CLR_INVALID);

    }
    //运行到这里就错了。全局函数定义:unsigned short s_version; 
    ULONG ipAddr=0;
    short ret = read_data(&g_Adapter,MacAdrs,PKT_TYPE_SETPASSWD_RREQ,PKT_TYPE_SETPASSWD_ACK,\
    "", 0,0,0);
    switch(ret)
    {
    case PKT_STAT_NORESPOND:
    return 0;
    case PKT_STAT_FAIL: //need password
    // if(IDOK != passDlg.DoModal())
    break;
    //return 0;
    case PKT_STAT_SUCCESS: //don't need password
    break;
    }
    // BeginWaitCursor();
    memset(&NVVars,0,sizeof(NVVars));
    short RetVal = read_data(&g_Adapter,MacAdrs2,PKT_TYPE_NVDATA_RREQ,PKT_TYPE_NVDATA_ACK,\
    "",0,(unsigned char*)&NVVars,sizeof(struct SD_parms)+12);
    ipAddr=ntohl(SysVars.Lan1IP);

    if(SysVars.IP_method==1)
    {
    s_version =ntohs(SysVars.version);
    if(s_version>750){
    ipAddr=ntohl(SysVars.DhcpIP);
    } } return ipAddr;