OnTimer(){
   //3秒的Timer
   if(flag = true){
      AfxBeginThread(Thread);
   }
}Tread(){
    flag = false;
    //处理
    flag = true;
}上述的代码在理论上应该是有问题的,但是在实际的过程中会启动两个线程吗?我认为应该不会,但是从log中发现好像存在。由于原来的程序log太少,所以我担心我的分析有问题。所以请教各位一下!谢谢!

解决方案 »

  1.   

    都有可能,主要看你Tread处理的快慢,如果慢的话,你定时器跑个不停,那么,可能有很多线程,如果快的话,在下一个线程开始以前,前面的已经结束了。
      

  2.   

    也就是说,在启动一个线程之后,有可能切换到主线程,然后3秒钟之后再来真正的设置那个flag为false?3秒钟是不是太长了?
      

  3.   

    if(flag = true)应该改成 if(flag == true){
      

  4.   

    另外,注意,你的flagy应该是:volatile bool flag;不过,这样还是不行,建议用临界变量,我给你一个多线程的例子,你自己看一下,很简单的例子:
    http://download.csdn.net/detail/fandh/1123495
      

  5.   

    看你处理的快慢,多线程多线程,如果是单核的CPU,那它肯定是分时间片来处理的。
    如果你对你的线程处理有什么要求而又怕处理的时间不对的话,最好还是设置个标志什么的来确定一下吧,CEvent之类的
      

  6.   

    非常感谢的你的回答。但我的意思是在3秒钟的时间内,有可能flag 还没有被设置成false吗?不过实际的程序中flag确实不是volatile 的。
      

  7.   

    我现在主要想调查一个问题是不是由于这个问题引起的,我通过分析log发现好像出现了两个子线程。是不是flag不是volatile 的,导致虽然将它设置成了flase,但是在主线程判断这个值的时候还是从寄存器中读的,导致出现了两个子线程。这种情况是否会出现呢?
      

  8.   

    volatile 应该没事了,但考虑一下:如果timer不是3秒,而是毫秒级别,那么启动线程后,thread还没执行,就到另一个timer tick了。安全起见 最好使用同步技术吧
      

  9.   

    楼上各位分析的均有道理,最简单的修改方法是OnTimer(){
       //3秒的Timer
       if(flag = true){
       flag = false;
       AfxBeginThread(Thread);
       }
    }Tread(){   //处理
       flag = true;
    }
      

  10.   

    可以检测 AfxBeginThread  启动线程是否成功,如果没成功将flag = true,这样代码更健状些。
      

  11.   

    关键是volatile没写!!!!