2009-08-21 11 views
2

私の質問の簡単なバージョン:boost:スレッドがMicrosoft C++コンパイラをクラッシュする

このコードはコンパイラをクラッシュさせます。

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

このコードをコンパイルしようとすると、コンパイラがクラッシュします。 (私はこのコードを実行するときに私のプログラムは、ひどいですか?)

何が修正する必要がありますか? 8コアのマシンを利用するように質問

私は8つの別々の仕事に大きな3Dグリッド上で作業を分割していますの


ロングバージョンは、別々のスレッドで実行されます。

これは完璧に動作します:

グローバルfree関数の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

をCL.EXEません。 "?内部コンパイラエラーを報告しますか? –

+2

ここには「コンパイラクラッシュ」はありません。私もコンパイラのエラーは表示されません!あなたが得るのは、C++コンパイラからの2つの警告、そして 'vcbuild'からのエラーです。私はあなたが1)/ W4でコンパイルしていることと、2)あなたの '.vcproj'ファイルに何らかのエラーがあることを強く疑う。プロジェクトファイルを表示してください。 'cGridAnimator :: DoJob()'の署名も役に立ちます。 –

+0

あなたはその部分にぴったりです。通常はICEがビルドログに出力されますが、アプリケーションのクラッシュは通常errorlevel = 1 ... Dumb meにはなりません。 – gimpf

答えて

3

変更へのコード:このコードではなくvoid (int)機能のスレッドと追加の引数にvoid (void)機能を提供します

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

+0

これは、コンパイラのクラッシュを修正します。私はいくつかのテストを行い、それがうまくいくならこの答えを受け入れます。 – ravenspoint

+0

ニースキャッチ!答えが明白であるので答えが述べられているように、あなたはそれをどのように見つけましたか? – gimpf

+1

警告メッセージにDoJobの署名が表示されます。私は引数の数が適合しないたびに同じコンパイラがほとんどクラッシュすることがあります。 – Willy

2

確定的な回答はありません。基本的に、ICEは常にコンパイラベンダーに連絡するのに適しています。

本当の原因を見つけるには、まだクラッシュを示す最小限のプログラムを見つけることが役立ちます。これは可能な限り多くのコードを削除し、できるだけ多くの依存関係を取り除くことなどを意味します。私は一度、新しいプロジェクトを開始して成功しましたが、問題の疑いがあるコードの50行を書きました。回避策以下の

は、過去に私を助け:

    • は、特にコードの生成には、ファイル のビット不安定
  1. 変更命令であると思われる時間をリンク最適化レベルを下げます
    • あなたがソースのリビジョンを知っていれば分かりますそれは動作を停止したときにあなたがそこに変更に集中できるので、異なるブーストバージョン
      • から
    • スイッチは、ブーストライブラリの作者は、回避策を有効にしていること、またはコードが正当な理由ではないのに十分な変更しますもうICE。
0

お知らせあなたがブースト::バインドを使用しており、パラメータの型が間違っている場合は、Visual Studioはクラッシュ」とはどういう意味ですかあなたにこのエラーを思い出させるが、PRJ0002とエラーと

関連する問題