8

それはGCC4.7.0ですか、それとも私ですか?私は何を間違えますか?

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(クラスwith 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 };
4

2 に答える 2

13

を使用してコードをコンパイルする場合は、このオプションg++を使用してください。-pthread

于 2011-09-09T18:51:30.570 に答える
0

私も同様の問題に直面していました、そしてジェイソンに感謝します、それは私の問題を解決しました

正確なオプションは

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

それは私がg++バージョン4.6.3でしなければならないことです

于 2013-06-11T17:52:12.963 に答える