2009-08-21 51 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