2009-08-21 56 views
2

我的问题的简短版本:boost:线程崩溃微软C++编译器

此代码崩溃了编译器。

pThread[0] = new boost::thread(
boost::bind(
    &cGridAnimator::DoJob, // member function 
     this),     // instance of class 
     0);     // job number 

尝试编译此代码时,编译器崩溃。 (当我运行这个代码时,这不是我的程序!)

什么需要修复?


问题

我分手了在大型3D网格工作纳入8个单独工作的龙版在单独的线程中运行,以便采取一个8芯机的优势。

这完美的作品:

全球免费功能DoJob从cGridAnimator的全局实例读取数据,根据工作数量。然而,我不喜欢所有这些全局变量的浮动,我不喜欢使用这么多的访问器方法来获取必要的数据。使用cGridAnimator的方法会更加整洁。

因此,代码在这个问题的顶部。

但是,当我在MSVC++ 2008上编译它时,编译器会发出以下抱怨,然后崩溃。

1>Compiling... 
1>mfm1.cpp 
1>C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1643) : warning C4180: qualifier applied to function type has no meaning; ignored 
1>  C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1677) : see reference to class template instantiation 'boost::_bi::add_cref<Pm,I>' being compiled 
1>  with 
1>  [ 
1>   Pm=void (__thiscall cGridAnimator::*)(int), 
1>   I=1 
1>  ] 
1>  .\mfm1.cpp(158) : see reference to class template instantiation 'boost::_bi::dm_result<Pm,A1>' being compiled 
1>  with 
1>  [ 
1>   Pm=void (__thiscall cGridAnimator::*)(int), 
1>   A1=cGridAnimator * 
1>  ] 
1>C:\Program Files\boost\boost_1_38_0\boost/mem_fn.hpp(318) : warning C4180: qualifier applied to function type has no meaning; ignored 
1>  C:\Program Files\boost\boost_1_38_0\boost/bind/bind_template.hpp(344) : see reference to class template instantiation 'boost::_mfi::dm<R,T>' being compiled 
1>  with 
1>  [ 
1>   R=void (int), 
1>   T=cGridAnimator 
1>  ] 
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe'. 
+0

你所说的“崩溃意思“?报告内部编译器错误? – 2009-08-21 17:08:25

+2

这里我没有看到任何“编译器崩溃”。我甚至没有看到编译器错误!你得到的只有2个来自C++编译器的警告,然后是来自'vcbuild'的错误。我强烈怀疑你1)正在编译/ W4,2)在'.vcproj'文件中有一些错误。请显示项目文件。 'cGridAnimator :: DoJob()'的签名也是有帮助的。 – 2009-08-21 17:19:02

+0

你是对的那部分。一个ICE通常被打印到生成日志,并且应用程序崩溃通常不会导致errorlevel = 1 ...愚蠢的我。 – gimpf 2009-08-21 17:23:16

回答

3

更改代码为:

pThread[0] = new boost::thread(boost::bind(&cGridAnimator::DoJob, this, 0)); 

该代码给出了一个void (void)功能的线程,而不是void (int)功能和一个额外的参数。

+0

这可修复编译器崩溃。我会做一些测试,如果有效,接受这个答案。 – ravenspoint 2009-08-21 17:47:27

+0

好的!答案是这样说的,因为这很明显:你是怎么发现的? – gimpf 2009-08-23 16:56:08

+1

您可以在警告消息中看到DoJob的签名。几乎每次参数数量都不合适时,我的编译器崩溃几乎相同。 – Willy 2009-08-25 09:32:57

2

没有确切的答案;基本上,ICE总是联系编译器厂商的一个很好的理由。

要找到真正的原因,它将有助于尝试找到仍显示崩溃的最小程序。这意味着删除尽可能多的代码,尽可能多地去除依赖关系等等。对于一个ICE,我曾经在开始一个新项目方面取得了成功,并且只是写了我猜测问题的五十行代码。

以下变通方法,帮助我在过去的:

  1. 降低优化级别
    • 特别是链接时代码生成似乎有点不稳
  2. 变更单的包含文件
    • 只有知道源代码的修订版当它停止工作,这样你就可以有
  3. 开关集中于改变到一个不同的增压版本
    • 升压库的作者可能已经开启了一个解决办法,或代码只是改变足以不会引起ICE了。
0

注意,如果你正在使用boost ::绑定,参数类型错误时,Visual Studio不会提醒你这个错误,但PRJ0002错误和CL.EXE