我有个全局变量a,只会在一个线程thread1中会进行a赋值操作,其他thread2线程只会进行a读取操作,程序如下:
char g_cA;void thread1(void)
{
   while(1)
   {
       g_cA = 'a';
       SetEvent(hEvent2); 
       dwReturnSingle = WaitForSingleObject(hEvent1, 200);
       switch(dwReturnSingle)
       {
          case WAIT_OBJECT_0:
                { ...}
                break;
          default:
                break;
       }
       g_cA ++; //这里原本应该是'a' ++,可是有时候会是其他字符++;
      {...}
       
   }
}void thread2(void)
{
   int iTmp;
   while(1)
   {
       dwReturnSingle = WaitForSingleObject(hEvent2,INFINITE);
       if (dwReturnSingle == WAIT_OBJECT_0)
       {
           iTmp = g_cA;
           {...}
       }
       SetEvent(hEvent1);
   }
   
}
现在问题是:
偶尔会出现在线程thread2读值操作以后setevent,thread1中waitforsingleobject()同步以后,这个a值偶尔会发生改变。真不知道怎么会变,因为a的赋值在thread1中。
如上面程序,开始在Thread1中g_cA = 'a'; 在Thread2中把这个值传给iTmp;在返回到Thread1后,有时候会变。。
请大家帮帮想想,谢谢了

解决方案 »

  1.   

    hEvent1,hEvent2
    都没讲清楚是什么属性的?还有这2个线程会一直执行下去?什么时候停?
      

  2.   

    试试 volatile char g_cA;
      

  3.   

    to shareyao,sorry,没有说清楚,两个Event都是自动型的。
    两个线程不会停的,thread1是发送线程,thread2是接收线程。to BoXoft :volatile 关键字表示这个变量不知道什么时候会被动被改变,因此告诉编译器不要优化它,不要读现有寄存器中的它,而每次去重新读它的地址的值。但是我的这个变量不要求它这样,反而是相反的功能,我的g_cA是只会在thread1赋值,其他线程都是读取而已。我真的搞不明白什么原因了,请大家帮帮忙吧。
      

  4.   

    char这样简单的变量就不必用event来同步了。
    用volatile在加InterlockedExchange(赋值)或InterlockedIncrement(++操作)就行啦。
    另外,你的thread1并不是单单对a赋值,g_cA++是包含读写操作的。
      

  5.   

    现在我用局部变量还是出现乱跑的现象,就是在waitforsingleobject后。
      

  6.   

    WaitForSingleObject(hEvent1, 200);
    你的等待时间太短了,200ms,来个Infinite试试
    另外,如果你这样写WaitForSingleObject(hEvent1, 200);
    event2可能会被set多次的,这是不好的编程手法
      

  7.   

    to rickerliang:
    WaitForSingleObject(hEvent1, 200);
    你的等待时间太短了,200ms,来个Infinite试试这样不行,因为我thread1不能一直等待,基本在一段时间后我是要返回的,因为thread2是查询数据。另外,如果你这样写WaitForSingleObject(hEvent1, 200);
    event2可能会被set多次的,这是不好的编程手法没有明白你的意思,event2可能被set什么多次?setevent???什么情况下setevent2会多次?请教了
      

  8.   

    我还不是很懂你的代码想达到什么效果是不是这样:volatile char g_cA;void thread1(void)
    {
       while(1)
       {
    InterlockedExchange((LONG *)&g_cA,'a');
    // g_cA = 'a';
        
    // g_cA ++; //这里原本应该是'a' ++,可是有时候会是其他字符++;
    InterlockedIncrement((LONG *)&g_cA);       
       }
    }void thread2(void)
    {
       int iTmp;
       while(1)
       {
           iTmp = g_cA;
       }
       
    }还是
    thread2只想得到g_cA自加后的值?
      

  9.   

    to rickerliang:
    thread1是一个循环g_cA ++,
    thread2是根据g_cA 来循环做一些事情。
    也就是说thread1中的g_cA 要影响到thread2中的执行流程
      

  10.   

    thread1是一个循环g_cA ++,
    ???不懂
    如果是循环g_cA++,为什么你的while循环的第一句就是一个g_cA的赋值语句?
    如果是这样,g_cA的值只有2个可能:'a'或'b'
    while(1)
       {
           g_cA = 'a';
           ...
       }
      

  11.   

    to rickerliang:
    sorry,我没有把程序些完,的确只是写了一个大概意思,g_cA这个变量是a到g的数,就是a到g之间不停循环
      

  12.   

    先谢谢各位了
    我在重新说一下
    两个event hEvent1 hEvent2都是自动型的。
    g_cA = 'a';
    void thread1(void)
    {
       while(1)
       {     switch (g_cA)
        { 
        case 'a';
                 do some...
                  break;
        case 'b';
                 do some...
                  break;
        case 'c';
                 do some...
                  break;
        default:
               g_cA = 'a';
               contiune;
         }   
      senddata();
       WaitForSingleObject(hEvent1,INIFINTE);
       {do some... }     g_cA ++; //如果之前是’a‘,在++之前,WaitForSingleObject返回之后,应该还是’a‘,可是现在它可能边为’c‘,或’b‘,不知道哪里出问题了
       }
    }void thread2(void)
    {
       int iTmp;
       while(1)
       {
           WaitForSingleObject(hEvent2,INIFINTE);
            recvdata()
         switch (g_cA)
        { 
        case 'a';
                 do some...
                  break;
        case 'b';
                 do some...
                  break;
        case 'c';
                 do some...
                  break;
        default:
                  break;
         }
        SetEvent(hEvent1);   }
       
    }谢谢了
      

  13.   

    写漏了一句话,
    在thread1里面,senddata以后,WaitForSingleObject之前,有一句SetEvent(hEvent2)
      

  14.   

    char g_cA;void thread1(void)
    {
       while(1)
       {
           g_cA = 'a';
           SetEvent(hEvent2); 
           dwReturnSingle = WaitForSingleObject(hEvent1, 200);
           switch(dwReturnSingle)
           {
              case WAIT_OBJECT_0:
                    { ...
    //////////////////你的本意是通过thread2的SetEvent(hEvent1);来改变g_cA?
                      g_cA ++; //这样?
                     }
                    break;
              default:
                    break;
           }
                 {...}
           
       }
    }
      

  15.   

    奇怪,你最初版本是
    WaitForSingleObject(hEvent1, 200);
    现在又是
    WaitForSingleObject(hEvent1,INIFINTE);
    究竟是怎么样的啊?
      

  16.   

    to rickerliang:
    sorry,的确是WaitForSingleObject(hEvent1,200);to regnig(fivefouroseven)
    不是你说的意思,g_cA++是在 switch(dwReturnSingle)之后的外面语句中。是自身++。先谢谢各位了,问题至少现在看来是解决(长时间考机验证,原来基本几分钟就会出现的错误)
    是线程的优先级问题,把thread1的优先级设置高与thread2就ok。