我在程序定义了一个类,在类中创建了一个线程,并传递给线程这个类的指针this,然后线程中的所有处理都用这个指针来访问这个类的成员函数,但奇怪的是当我在一个类成员函数(这个成员函数被这个线程所调用)中定义了一个static int dd的变量,同时在另一个类成员函数(这个成员函数被这个线程所调用)也定义了一个static buff[32];当线程写过buff后,dd的值就被改变了,变成一个负数,我怀疑线程的heap被改写了,但不知道是怎么引起的,请高手指教。

解决方案 »

  1.   

    是不是有可能你放在buff里的东西超过了数组大小,而把dd覆盖了?
      

  2.   

    这是个很典型的多线程竞争资源问题,
    其中的资源就是你的所谓静态变量.
    最简单高效的办法就是用临界区将这个资源保护起来.
    因为临界区不是内核对象,程序运行时不用从用户态到内核态的切换,
    所以在线程同步技术中是较率比较高的方式.
    1.创建一个全局临界区 
    CRITICAL_SECTION m_criticalSection;
    InitializeCriticalSection(&m_criticalSection);
    2.访问保护
    ::EnterCriticalSection(&m_criticalSection);
    //在这里操作你的静态变量.
    ::LeaveCriticalSection(&m_criticalSection);
    3.程序退出时关闭临界区
    DeleteCriticalSection(&m_criticalSection);
      

  3.   

    谢谢icecools(浮生若梦)和lzzqqq(Jonersen)的指点,经过查找,发现静态数组buff传递给另一个dll中的函数时,被那个函数写入了超过buff大小的内容。