文書   >   Code Diagnostics   >   Thread Sanitizer


プロトコル


Thread Sanitizer


あなたのコードのスレッドの問題を監査します。





概要


スレッドサニタイザー (TSan) は、Swift および C 言語用の LLVM ベースのツールであり、実行時にデータの競合を検出します。複数のスレッドが同期せずに同じメモリにアクセスし、少なくとも 1 つのアクセスが書き込みである場合、データの競合が発生します。データの競合は、プログラムが予期しない動作をしたり、メモリ破損を引き起こす可能性があるため、危険です。


TSan は、初期化されていないミューテックスやスレッドリークなどを含む、他のスレッドのバグも検出します。


重要

TSan は、64 ビット macOS と 64 ビット iOS および tvOS シミュレーターでのみサポートされています。 (watchOS はサポートされていません)。デバイスでアプリを実行しているときは TSan を使用できません。



TSan の仕組み


スレッドサニタイザーは、各メモリアクセスに関する情報を記録し、そのアクセスが競合に参加しているかどうかを確認します。コード内のすべてのメモリアクセスは、コンパイラによって次のように変換されます。


リスト 1 スレッドサニタイザーのメモリアクセス用の擬似コード


// Before
*address = ...;  // or: ... = *address;
// After
RecordAndCheckWrite(address);
*address = ...;  // or: ... = *address;


各スレッドは、同期点を確立するために、独自のタイムスタンプと他のスレッドのタイムスタンプを保管します。タイムスタンプは、メモリにアクセスするたびに増分されます。スレッド間でのメモリアクセスの一貫性を確認することにより、アクセスの実際のタイミングとは無関係にデータの競合を検出できます。したがって、スレッドサニタイザーは、特定の実行中に発生しなかった場合でも、競合を検出できます。


パフォーマンスへの影響


Thread Sanitizer チェックを有効にしてコードを実行すると、CPU が 2 倍から 20 倍遅くなり、メモリ使用量が 5 倍から 10 倍増加する可能性があります。-O1 最適化レベルでコンパイルすることにより、メモリ使用率と CPU オーバーヘッドを改善できます。


トピックス





第一段階




スレッドサニタイザーのチェック


以下も見よ





スレッド化

















トップへ












トップへ












トップへ












トップへ
目次
Xcode 11 の新機能

  • 言語:Swift
  • SDK
  • XCode 8.0+
  • 概要
  • トピックス
  • 以下も見よ












  • トップへ












    トップへ












    トップへ












    トップへ