2011-09-09 32 views
8

Có phải GCC 4.7.0 hay là tôi? Tôi làm gì sai?C++ 0x: chủ đề, gcc hoặc lỗi của tôi?

này ném một std::system_error"hoạt động không được phép" ngoại lệ:

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(); 
}; 

trong khi làm việc này:

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(); 
} 

Sự khác biệt là, tất nhiên:

  • này không -ngã chế biến sử dụng Functor (lớp học với operator())
  • Mã làm việc sử dụng một con trỏ hàm.

Tôi có sử dụng functor sai, ở đâu đó không? Tôi không thể nhìn thấy ở đâu, phải không? Có một gợi ý rằng gdb có này trong stack của nó:

#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> 

Ghi chú: Tôi cũng đã cố gắng

  • Initialize DumbFib đầu tiên, cho nó một kết quả tương tự thành viên biến n_=35,.
  • Cho các functor trực tiếp với thread th{ DumbFib, 35 }; hoặc thread th{ DumbFib{}, 35 };
+0

Bạn đang chạy hệ thống này trên hệ thống nào? – Jason

+1

linux 64bit (ubuntu 10.4 LTS), gcc-4.7.0, svn checkout từ tuần trước. – towi

Trả lời

13

Khi biên dịch mã của bạn với g++, sử dụng tùy chọn -pthread.

+0

Làm thế nào xấu hổ .. Tôi đã có lỗi đó một lần và nghĩ rằng tôi đã sửa chữa nó. Tôi đã không. Vì vậy, bây giờ nó hoạt động! Tuyệt quá! – towi

0

Tôi cũng đã phải đối mặt với vấn đề tương tự, và nhờ Jason, nó giải quyết vấn đề của tôi

Các tùy chọn chính xác sẽ

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

Đó là những gì tôi phải làm trên g ++ phiên bản 4.6.3

Các vấn đề liên quan