Teighaマルチスレッド低レベルAPI(4部構成の第3部)

この記事は、マルチスレッドに使用される低レベル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の使用に関するこのシリーズの最終記事にご注目ください。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す