Oracle® Developer Studio 12.5: スレッドアナライザユーザーズガイド

印刷ビューの終了

更新: 2016 年 6 月
 
 

スレッドアナライザの概要

スレッドアナライザは、このドキュメントで説明されているように、データの競合およびデッドロックを検査するために特別に作成できる実験で、これらのエラーを表示できます。

スレッドアナライザはスレッド分析実験を検査するために設計された、パフォーマンスアナライザの特殊なビューです。詳しくは、スレッドアナライザのインタフェースを参照してください。

データの競合とは

    スレッドアナライザは、マルチスレッドプロセスの実行中に生じたデータの競合を検出します。データの競合は、次のすべての条件に当てはまるときに生じます。

  • 単一プロセス内の 2 つ以上のスレッドが、同じメモリー位置に同時にアクセスする

  • 少なくとも 1 つが書き込みのためのアクセスである

  • どのスレッドも、そのメモリーへのアクセスを制御するための相互排他ロックを使用していない

この 3 つの条件が揃うとアクセス順序が定まらないため、実行するたびにその時の順序によって計算結果が異なる可能性があります。データの競合には、害のないもの (メモリーアクセスをビジーウェイトに使用するときなど) もありますが、データの競合の多くはプログラムのバグによるものです。

スレッドアナライザは、POSIX スレッド API、Oracle Solaris スレッド API、OpenMP、またはこれらの組み合わせを使用して作成されたマルチスレッドプログラムで動作します。

デッドロックとは

デッドロックとは、2 つ以上のスレッドが互いを待機しているために処理がまったく進まない状況を指します。デッドロックの原因は多数あります。スレッドアナライザは、相互排他ロックの不適切な使用によって生じたデッドロックを検出します。この種のデッドロックは、マルチスレッドアプリケーションでよく生じます。

2 つ以上のスレッドから成るプロセスは、次の条件がすべて揃うとデッドロックを生じることがあります。

  • すでにロックを保持しているスレッドが新しいロックを要求する

  • 新しいロックの要求が同時に行われる

  • チェーン内の次のスレッドで保持されているロックを各スレッドが待機するという巡回チェーンを、2 つ以上のスレッドが形成する

デッドロック状況の簡単な例を次に示します。

  • スレッド 1 はロック A を保持し、ロック B を要求する

  • スレッド 2 はロック B を保持し、ロック A を要求する

デッドロックには潜在的デッドロックとデッドロックの 2 種類があります。潜在的デッドロックは、所定の実行で必ず起きるわけではありませんが、スレッドのスケジュールや、スレッドによって要求されたロックのタイミングに依存したプログラムの実行で起きる可能性があります。実デッドロックは、プログラムの実行中に発生するものです。実デッドロックでは、関係するスレッドの実行がハングアップしますが、プロセス全体の実行がハングアップする可能性もあります。