2014年2月3日月曜日

Raspberry Pi: raspbian-wheezy/g++-4.7.2 で std::thread を使ったら pure virtual method called で abort する問題の回避方法

Raspberry Piraspbian-wheezyの環境にて、g++-4.7.2をapt-getで導入し、std::threadを含むコード、例えば次のような

をビルド( g++ -std=c++0x std_thread.cxx -lpthread )すると、実行時に

pure virtual method called
terminate called without an active exception
zsh: abort      ./a.out

とかなります。原因はよくわかりませんでした。

この環境でのコンパイルのみソースを分岐してdefferedにしてタイムアウトを付けてスレッドを起こさずに対処してみようかとも考えましたが、それはそれで面倒くさいので、GCC-4.7.3ターゲットのバグリストやらstackoverflowやら眺めてみましたがやはりわかりません。

よくわかりませんが、上記をヒントに -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 とかg++のコンパイルオプションに付けてみても何も起こりません。(そもそもこれはclangでの現象報告でしたがlibstdc++絡み…)

そこで、実装を大きく変更する前に std::thread を止めて boost::thread を使ってみました( g++ -std=c++0x boost_thread.cxx -lboost_thread )。raspbian-wheezyにパッケージのあるboost-1.49のboost::threadです。

結果、プログラムは実行時に謎のエラーでabortする事なく、意図した通りに動作してくれました。

Raspberry Pi環境ではその処理性能ゆえにアプリのビルドには非常に長い時間がかかるのであれこれと検証するのにも疲れました(´・ω・`)

std::threadが悪いのか、λ式が悪いのか、ステートレスλにしたら、λをやめてふつーの関数とそのポインターで渡したら、std::refが悪いのか、…たぶんg++-4.7.2のstd::threadに問題がありそうな気がするという辺りに落ち着いてはいるけど、よくわかりません(´・ω・`)

0 件のコメント:

コメントを投稿