它是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 };
你在使用什麼系統? – Jason
linux 64位(ubuntu 10.4 LTS),gcc-4.7.0,上週的svn結帳。 – towi