BOOL b_TerminateThread;///全局变量
DWORD dwRange;///全局变量
UINT ThreadCalc(LPVOID param)
{
if(dwRange>2)
{
for(DWORD i=2;i <= dwRange;i++)
{
BOOL bIsPrime=FALSE;
for(DWORD j=2;j <= sqrt(i);j++)
{
if(b_TerminateThread)break;

if(i % j ==0)
{
bIsPrime=TRUE;
break;
}
}
if(!bIsPrime)
dwMax=i;
if(b_TerminateThread)
{
return 0;
}
}
} b_TerminateThread = FALSE;
return 0;
}void CMultiThreadDlg::OnThreadEnd() 
{
b_TerminateThread=TRUE;
}

解决方案 »

  1.   

    因为编译器在优化的时候,如果不特殊声明,会把BOOL变量保存在寄存器里面,在线程生命周期里面不再从内存中读取,这样,外界对该变量的改变将不会被察觉,建议使用我的《多线程安全的变量模板》(http://www.csdn.net/develop/read_article.asp?id=13879)
      

  2.   

    应该定义你的BOOL b_TerminateThread;///全局变量
    为非寄存器变量,
      

  3.   

    补充:如果 b_TerminateThread 先设成 TRUE的话,是能马上退出的!
      

  4.   

    你的break只能结束里面那层的确for循环
      

  5.   

    关于编译器是否这么优化有待验证,至少目前我觉得这种做法不可取,如果我是写编译器的人。全局变量就是用来在不同模块传递信息的,用寄存器不可能。
    要验证也很容易,我在VC下编了个小程序,定义了一个全局BOOL变量(实际上就是int变量),然后在程序中用到这个全局变量,然后我再看汇编代码,事实证明根本没有用什么寄存器,这是显然不可能的。不知道这么说的老兄理从何来?楼主的问题还是另有原因,采用“线程安全的变量”当然能解决问题,但是我们更希望能解决为什么现在这样不行的问题啊。
      

  6.   

    有个疑问,搂主如何确定线程是否退出?另外,这个循环可能运行很快,是不是有可能在调用CMultiThreadDlg::OnThreadEnd之前,已经完成所有循环退出了?
      

  7.   

    我认为上面的代码如果仅仅如此的话,肯定可以安全退出,正如timeguest所说,应该是其它地方有问题。