一个类
Class A
{
public:
 void StartThread();
 static UINT ThreadFun(LPVOID lParam);
 static void Fun();
};void A::StartThread()
{
 AfxBeginThread((AFX_THREADPROC)A::ThreadFun,(LPVOID)NULL);
}
UINT A::ThreadFun(LPVOID lParam)
{
  for(;;)
  {
    Sleep(0);
    //此处调用Fun()函数,该函数处理时间比较长
    Fun();
    //其他处理  }
}调试运行的时候,发现在进入Fun计算过程中,for循环还没等Fun返回,就进行下一次循环了,造成的结果是Fun在同时间执行了两次。
问题是:线程循环中为什么会出现函数没返回就执行下一个循环了?另外一个情况是:

Class B
{
//..
};线程调用该类的其他函数执行一些计算
UINT A::ThreadFun(LPVOID lParam)
{
  B b;
  for(;;)
  {
    Sleep(0);
    //此处调用class B的成员函数,该函数处理时间比较长
    b.somefun();
    //其他处理  }
}线程执行以后,同样出现还类b的函数还没返回就继续下一个循环了,这种情况又是什么原因?

解决方案 »

  1.   

    线程本身就是这样,异步执行。因为你没有同步控制!!
    在侯捷译的《win32 多线程程序设计》中就有,用Sleep()中的时间长点,或者调用等待线程结束函数。
      

  2.   

    同一个线程里面不可能异步执行,Fun();应该要执行完毕才能往下跑。是不是你Fun();函数里面又新开线程了?
      

  3.   

    Fun()里绝对没有跳出或者新开线程,只是执行了一些比较长时间的处理而已,例如数据库的一些查询,文件的打开、写数据等。而且关键是执行类的对象函数也有这样的问题,莫名其妙,现在主要是想了解清楚为什么会这样或者那些情况有可能产生这样的问题?
      

  4.   

    你确定A::StartThread 没有连续被调用两次?
      

  5.   

    如果在Fun里没有开其他线程的话应该不会出现这个问题啊,很奇怪
      

  6.   

    应该是 fun 的问题 或者 还启动了其他线程。最后,你判断它执行两次的标准是什么?这也可能是一个问题。
      

  7.   

    检查一下fun中的代码,看是不是异常了
      

  8.   

    StartThread只调用了一次,因为它是在程序OnCreate里执行的,创建了该线程以后,该线程就循环执行,直到程序结束。
      

  9.   

    终于找到问题了,谢谢上面的高手的启发,我在调用的函数中返回后,做判断是否成功,如果不成功就continue,调试的时候没仔细检查逻辑关系,以为是调用了多次该函数了,实际上同一线程是不会异步调用同线程内同一个函数或对象函数的。揭贴