この記事は、マルチスレッドに使用される低レベルAPIに関するシリーズの一部です。以前の記事については、パート1とパート2を参照してください。
組み込みのTeighaスレッドIDアクセサー
各スレッド(メインプロセススレッドを含む)は、どのオペレーティングシステム上でも一意のオペレーティングシステムアトムとして表現されるため、独自の一意のシステムレベルIDを持っています。スレッドIDの可用性は、スレッドとプロセスを開始するフレームワークの複雑さに依存しません。これは、たとえば、.NET Frameworkオブジェクトを使用してスレッドが開始された場合でも、そのスレッドには基になるネイティブコードからアクセスできる一意のシステムレベルIDが含まれることを意味します。
スレッドIDは、スレッドカウンターによって外部スレッドとの通信に使用されます。
現在Teighaコードを実行している任意のスレッドから、TeighaクロスプラットフォームのodGetCurrentThreadId関数を使用して現在のスレッドIDにアクセスできます。
FIRSTDLL_EXPORT unsigned odGetCurrentThreadId();
このIDは、Teighaスレッドカウンターオブジェクト内でスレッドを識別するために使用できます。
odGetCurrentThreadId()関数の使用例
ミューテックスオブジェクトに関するパート2からのコンソール出力を拡張します。ProcessImageCaller::entryPointメソッド内の出力文字列を拡張して、処理されたスキャンライン情報とともに現在のスレッドIDを出力します。
pCaller->m_pOutput->addString(OdString().format(OD_T("Thread %u processed scanlines from %u to %u\n"),
::odGetCurrentThreadId(), (unsigned)pCaller->m_scanLineFrom,
(unsigned)(pCaller->m_scanLineFrom + pCaller->m_nScanLines - 1)));
これで、サンプルアプリケーションのコンソール出力は次のようになります。
4つのファイルが0.413389秒でロードおよびレンダリングされました
スレッド8240は0から255までのスキャンラインを処理しました
スレッド7508は256から511までのスキャンラインを処理しました
スレッド8776は768から1023までのスキャンラインを処理しました
スレッド10040は512から767までのスキャンラインを処理しました
最終ラスタ画像は0.543844秒で処理されました
アトミック操作とマルチスレッド低レベルAPIの使用に関するこのシリーズの最終記事にご注目ください。