boost:thread崩溃了microsoft C ++编译器

时间:2009-08-21 16:55:37

标签: c++ boost multithreading

我的问题的简要版本:

此代码使编译器崩溃。

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

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

需要修复什么?


长版问题

我正在将大型3D网格上的工作分成8个单独的作业,以便在单独的线程中运行,以便利用8核机器。

这非常有效:

    JOB_LOOP {
        pThread[kjob] = new boost::thread( ::DoJob, kjob );
    }

全局自由函数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'.

3 个答案:

答案 0 :(得分:3)

将代码更改为:

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

此代码为线程提供void (void)函数,而不是void (int)函数和额外参数。

答案 1 :(得分:2)

没有确定的答案;基本上,ICE始终是联系编译器供应商的一个很好的理由。

要找到真正的原因,它将有助于尝试找到仍然出现崩溃的最小程序。这意味着删除尽可能多的代码,删除尽可能多的依赖关系等等。对于一个ICE,我曾经成功开始一个新项目,只是写了五十行代码,我怀疑这个问题

以后的解决方法帮助了我:

  1. 降低优化级别
    • 特别是链接时间代码生成似乎有点不稳定
  2. 更改包含文件的顺序
    • 只有在你停止工作时知道源的修改才明智,所以你可以专注于那里的改变
  3. 切换到其他升级版本
    • 升级库作者可能已经激活了一个变通方法,或者代码刚刚改变到不再导致ICE。

答案 2 :(得分:0)

请注意,如果您使用的是boost :: bind,并且参数类型错误,Visual Studio将不会提醒您此错误,但PRJ0002和cl.exe错误