このセクションの内容

事前準備

マルチスレッド アプリケーションをテストするには、ビルド設定のコンパイラ オプションに次のオプションを追加します。ビルド設定の詳細については 「プロジェクトとファイルのオプション設定」 を参照してください。

"-DCPPTEST_THREADS=1"

このオプションは、C/C++test ランタイム ライブラリのマルチスレッド サポートを有効にし、スレッド関係のルーチンに対するセーフ スタブの使用を無効にします。

注意事項

  • C/C++test のテスト実行可能ファイルは適切なランタイム ライブラリ (Visual C++ コンパイラの場合はマルチスレッド版の C ランタイム ライブラリ、UNIX では pthread ライブラリ) とリンクされている必要があります。
  • C/C++test ランタイムはスレッドの生存期間をコントロールしません。テスト ケースが完了したときにすべてのスレッドが終了されるようにテスト ケースを実装することを推奨します。

既知の問題と制限事項

既知の問題と制限事項は以下のとおりです。

  • -DCPPTEST_THREADS=1 を使用してマルチスレッド サポートを有効にしているが、適切なライブラリがリンクされていない場合 (またはマルチスレッドとシングルスレッドの C ランタイムが混在している場合)、テスト実行可能ファイルは不正なテスト結果を出力したり、予期しないときに終了する可能性があります。
  • メイン スレッド以外のスレッドでの予期しない振る舞い (シグナル、処理されない例外、タイムアウトなど) により、テスト実行可能ファイルが終了する場合があります。

C/C++test ランタイム ライブラリのビルド

C/C++test のデフォルトのランタイム ライブラリは、あらかじめマルチ スレッドをサポートしています。たとえば組込みのテストを行うなどのために、マルチスレッドをサポートするカスタム ランタイム ライブラリをビルドする場合を除いて、追加の作業を行う必要はありません。マルチスレッドをサポートするカスタム ランタイム ライブラリをビルドする必要がある場合、コンパイラ コマンドラインに次を追加します。 "- DCPPTEST_THREADS_ENABLED=1"

サポートされるスレッド API

ランタイム ライブラリ実装は、以下の種類のスレッド API を使用できます。

  • Windows スレッド
  • POSIX スレッド
  • VxWorks 6.x

他のスレッド API の使用

他のスレッド API (またはカスタム API) を使用する必要がある場合、以下の型とルーチンを実装する必要があります。

C/C++test ランタイム ソースの CppTestThread.c ファイルには、スレッド サポート ルーチンの定義が含まれていることに注意してください。このファイルをサンプルとして使用したり、変更のベースとすることができます。

TIs - Thread Local Storage

typedef IMPLEMENTATION_DEPENDENT_TYPE CppTestThreadKey;
/**
* Creates key for thread local storage data * Returns 0 on success
*/
extern int localThreadKeyCreate(CppTestThreadKey* key);
/**
* Deletes key for thread local storage data * Returns 0 on success
*/
extern int localThreadKeyDelete(CppTestThreadKey key);
/**
* Returns a thread specific value associate with a key */
extern void* localThreadGetSpecific(CppTestThreadKey key);
/**
* Associate a thread specific value with a key * Returns 0 on success
*/
extern int localThreadSetSpecific(CppTestThreadKey key, void* value);

Mutex

注意: C/C++test ランタイムは、mutex を静的に初期化できると仮定します。

typedef IMPLEMENTATION_DEPENDENT_TYPE CppTestThreadMutex;
#define CPPTEST_THREADS_MUTEX_STATIC_INIT <IMPLEMENTATION_DEPENDENT_STATIC_INITIALIZER>
/**
* Initializes mutex
 * @return 0 on success
 */
extern int localThreadMutexInit(CppTestThreadMutex* mutex);
/**
* Destroy and release resources used by mutex * @return 0 on success
*/
extern int localThreadMutexDestroy(CppTestThreadMutex* mutex);
/**
* Lock mutext and return when calling thread becames is owner of it. * @return 0 on success
*/
extern int localThreadMutexLock(CppTestThreadMutex* mutex);
/**
 * Releases mutex owned by calling thread.
 * @return 0 on success
 */
extern int localThreadMutexUnlock(CppTestThreadMutex* mutex);

その他

/**
 * Exits calling thread
 * (never returns)
 */
extern void localThreadExit();
/**
* @return non-zero if threads already finished execution */
extern int localThreadFinished(CppTestThread* thread);
/**
* @return non-zero if threads are supported in current build 
* (proper macros, libraries, compiler options were used).
*/
extern int localThreadsSupported(void);
/**
 * Initializes given thread structure
 */
extern void localThreadInit(CppTestThread* thread);
  • No labels