無関係な質問exposes a pattern that looked similar to yoursを読んで、私はあなたの奇妙なコードの起源を発見したと思います。
おそらくこのコードはpthread
ライブラリが実際にリンクされていたかどうかを確認するため__gthread_active_p()
を使用して、特定のもので、スレッド関連のC++ 11の機能の拡張に由来しています。潜在的ににあり
ほとんどのコードにlibstdcにおけるスレッドの問題との契約++(しかし、何のスレッドのサポートが必要とされないときのための合理的なフォールバックを持っている)は、シンボル__pthread_key_create
がある場合は順番に、一般的にチェックするまで沸騰する
if(__gthread_active_p())
が散らばっていますNULL
とは異なるものに定義されています。ここでのトリックは、がと__attribute__ ((weak))
と宣言されているため、定義がない場合(つまり、pthread
ライブラリがリンクされていない場合)、リンカはNULLへの参照を解決します。
コンパイラがスレッド関連の処理を行うために残したチェック(つまり、共有リソースを保護するためのミューテックスの取得など)は、コードに表示されます。あなたはNULL
ポインタに解決すべて__pthread
シンボルを参照してください
mov eax,__pthread_key_create
test rax,rax
jz .skip_mutex_init
call __pthread_init_some_mutex
.skip_mutex_init:
mov rax, 0xffffffffffffff60
sub rbx,r15
add QWORD PTR fs:[rax],rbx`
:事前にリンクのコードは、おそらくのようなものです。コンパイラは、-lpthread
でリンカが呼び出されるかどうかを知ることができず、リンカはダム置換を実行するだけです(LTOが有効になっていない限り、再度オプティマイザを実行するには遅すぎます)。全く異なるゲーム)。
あなた自身同様のパターンplaying with the compiler explorerを見ることができます:完全なバイナリ(11010キャプションと右のボタン)を結ぶ有効/無効にしてみてください、とコマンドラインで-pthread
を追加/削除。
さて、私は正確にあなたの結果を再現するために管理していませんでしたが、おそらくそれが使用されている、または別のスレッド対応のコンポーネントは、あなたのコード内で使用されているlibstdc++
の異なるバージョンから来ている(私はちょうどstd::mutex
とstd::shared_ptr
てみました) 。
そのビットを削除して、違いがあるかどうかを確認してください。 –
@MadPhysicist? – vladon
@PeterCordesそれは-O2とclangです。見て、eaxはゼロですが、レックスはテストしました。 – vladon