Microsoft DirectX 8.0

クリティカル セクション デバッグ関数

これらの関数はコード内のクリティカル セクションのデバッグの手助けとなり、デッドロックの原因の発見が容易になる。これらの関数はCCritSec ヘルパー クラスを使用している

宣言 : Wxutil.h

CritCheckIn 現在のスレッドが特定のクリティカル セクションを所有していることをチェックする。
CritCheckOut 現在のスレッドが特定のクリティカル セクションを所有していることをチェックする。
DbgLockTrace 特定のクリティカル セクションのデバッグ ロギングを有効または無効にする。

CritCheckIn

クリティカル セクション デバッグ関数

現在のスレッドが指定したクリティカル セクションの所有者なら TRUE を返す。

構文

BOOL WINAPI CritCheckIn(

  CCritSec *pcCrit
  );

パラメータ

pcCrit
CCritSec クリティカル セクションへのポインタ。

戻り値

デバッグ ビルドのとき、現在のスレッドがこのクリティカル セクションの所有者である場合は TRUE を返し、それ以外の場合は FALSE を返す。リテール ビルドのとき、常に TRUE を返す。

注意

この関数は ASSERT マクロと同時に使うと、スレッドが与えられたロックを所有しているかどうかをテストするのに非常に便利です。

次のコード例はこの関数の使い方を示す :

{
    CCritSec MyLock;  // クリティカル セクションはまだロックしていない
    
    ASSERT(CritCheckIn(&MyLock)); // この assert はメッセージを出す

    // クリティカル セクションをロックする    
    CAutoLock cObjectLock(&MyLock);
     
    ASSERT(CritCheckIn(&MyLock)); // この assert はメッセージを出さない

} // ロックのデバッグはここまで

CritCheckOut

クリティカル セクション デバッグ関数

現在のスレッドが指定したクリティカル セクションの所有者のとき FALSE を返す

構文

BOOL WINAPI CritCheckOut(

  CCritSec *pcCrit
  );

パラメータ

pcCrit
CCritSec クリティカル セクションへのポインタ。

戻り値

デバッグ ビルドのとき、現在のスレッドがこのクリティカル セクションの所有者の場合は FALSE を返し、それ以外の場合は TRUE を返す。リテール ビルドのとき、常に TRUE を返す。

注意

この関数は CritCheckIn 関数の逆である。CritCheckIn が TRUE のとき、CritCheckOut は FALSE を返し、反対なら TRUE を返す。

DbgLockTrace

クリティカル セクション デバッグ関数

特定のクリティカル セクションのデバッグ ロギングを有効または無効にする。

構文

void WINAPI DbgLockTrace(

  CCritSec *pcCrit,
  BOOL fTrace
  );

パラメータ

pcCrit
CCritSec クリティカル セクションへのポインタ。
fTrace
ロギングを有効にするかどうかを指定する値。ロギングを有効にするには TRUE を使用し、ロギングを無効にするには FALSE を使用する。

注意

この関数を使って指定したクリティカル セクションをトレースする。デフォルトではクリティカル セクションでデバッグ ロギングは無効です、なぜならクリティカル セクションの数が非常に多いからです。

クリティカル セクションをトレースするには、次のステップを行う:

  1. DirectShow ヘッダーをインクルードする前に DEBUG を定義する。
  2. DbgSetModuleLevel を LOG_LOCKING フラグで呼び出してクリティカル セクションのデバッグ ロギングを有効にする。
  3. トレースしたいクリティカル セクションで DbgLockTrace を呼び出す。

次のコード例はクリティカル セクションのトレース方法を示す :

DbgInitialise(g_hInst);
DbgSetModuleLevel(LOG_LOCKING, 3);

{
    CCritSec MyLock;
    DbgLockTrace(&MyLock, TRUE);
    
    CAutoLock cObjectLock(&MyLock);

    // コードの保護された部分    
    DbgOutString("This code is inside a critical section.\n");

} // ロックのデバッグはここまで

DbgTerminate();

デバッグ出力は以下の様に見ることができる :

Example.exe(tid 360)     2012 : Thread 864 now owns lock 12fc2c
This code is inside a critical section.
Example.exe(tid 360)     4887 : Thread 864 releasing lock 12fc2c

DirectShow ヘッダーをインクルードするとき、DEBUG が定義されていないと、DbgLockTrace 関数は有効にならない。