1.3. スレッドモデル

スレッドセーフ/アンセーフ

Pia の API の多くはスレッドアンセーフです。個々の関数リファレンスにおいて、特にスレッドセーフ/アンセーフについて言及していない API は、基本的にスレッドセーフをサポートしていません(スレッドセーフな API についての説明は随時追加していく予定です)。複数スレッドから Pia API を呼び出す際はアプリケーション側で排他制御を確実に行う必要がありますが、ロックなどの手段を用いた場合、その分だけ CPU を消費することに留意する必要があります。

Pia API 呼び出しスレッド

Pia API は内部で NEX の API を呼び出す場合があるため、Pia の API はすべて NEX の API を呼び出すスレッドと同一のスレッドから呼び出す必要があります。

PiaTransport の送受信スレッド

PiaTransport は、送信スレッド1つと受信スレッド1つを作成します。長時間ブロックする可能性のある送受信処理は送受信スレッドで行われるため、送受信 API 呼び出しによってアプリケーションが長時間ブロックされることはありません。

サポートする NEX のスレッドモード

NEX を使用する場合、 NEX のスレッドモードは nn::nex::Core::ThreadModeUnsafeUser または nn::nex::Core::ThreadModeUnsafeTransportBuffer に設定します。 NEX のスレッドモードがこれら以外のものに設定されていた場合、 Pia の API はエラーを返したり、アサート停止したりすることがあります。

スレッドローカルストレージの使用

Pia では内部のスレッド管理を効率的にする目的で、 nn::pia::common::Initialize() から nn::pia::common::Finalize() の間 nn::os::ThreadLocalStorage を使用しています。

debug, develop 版では2スロット、 release 版では1スロット使用します。アプリケーションで使用する nn::os::ThreadLocalStorage のスロット数に注意する必要があります。。