2011-09-09 53 views
8

它是GCC 4.7.0還是我?我做錯了什麼?C++ 0x:線程,海灣合作委員會或我的錯誤?

這引發std::system_error「不允許操作」例外:

struct DumbFib { 
    size_t operator()(size_t n) { return fib(n); } 
    static size_t fib(size_t n) { 
     return n<2 ? 1 : fib(n-2)+fib(n-1); 
    } 
}; 

void sample() { 
    DumbFib dumbfib; 
    thread th{ dumbfib, 35 }; // <- system_error! 
    th.join(); 
}; 

,而這個工程:

void work(size_t loop) { 
    for(int l = loop; l>0; --l) { 
     for(int i = 1000*1000; i>0; --i) 
      ; 
     cerr << l << "..."; 
    } 
    cerr << endl; 
} 

int main() { 
    //sample(); 
    thread t { work, 100 };  // <- fine 
    t.join(); 
} 

不同的是,當然是:

  • 的不工作代碼使用一個Functor(帶operator()的類)
  • 工作代碼使用函數指針。

難道我用的是函子錯在什麼地方?我看不到在哪裏,是嗎?它是一個暗示,gdb有這個在它的堆棧:

#7 ... in std::thread::_M_start_thread (..., __b=warning: RTTI symbol not found\ 
    for class 'std::_Sp_counted_ptr_inplace<std::thread::_Impl<std::\ 
    _Bind_simple<DumbFib()(int)> >, ..., (__gnu_cxx::_Lock_policy)2> 

注:我也嘗試過

  • 初始化DumbFib第一,給它一個成員變量n_=35,相同的結果。
  • 給仿函數直接與thread th{ DumbFib, 35 };thread th{ DumbFib{}, 35 };
+0

你在使用什麼系統? – Jason

+1

linux 64位(ubuntu 10.4 LTS),gcc-4.7.0,上週的svn結帳。 – towi

回答

13

g++編譯代碼,使用-pthread選項。

+0

多麼尷尬..我曾經犯過這個錯誤,並認爲我糾正了它。我沒有。所以,現在它工作!大! – towi

0

我也面臨類似的問題,並感謝傑森,它解決了我的問題

確切的選項將是

g++ code.cpp -lpthread -std=c++0x 

這就是我要對克做++版本4.6.3

相關問題