非同期イベントとコンカレンシー
Azure Sphere プラットフォームでは、イベント ループや POSIX pthreads など、非同期イベントとコンカレンシーを処理するためのいくつかの一般的な POSIX および Linux メカニズムがサポートされています。
サンプルでは、 Azure Sphere イベント ループ を使用して、イベントドリブン シナリオを安全に管理する方法を示します。 たとえば、UART サンプルは、デバイスが UART 経由でデータを受信するまで、またはボタンを押して UART 経由でデータを送信するまで一時停止します。
イベント ループは、ほとんどのグラフィカル ユーザー インターフェイスと標準 Linux パターンの標準部分です。 Azure Sphere イベント ループは、Azure Sphere アプリケーションが更新に関連するイベントなどのシステム通知を受信できるようにする、イベント ループの特定の実装です。
次の理由から、イベント ループ パターンをお勧めします。
OS やアプリケーション更新通知などのシステム イベントを管理するために、Azure Sphere イベント ループが必要です。 デバイスの更新プログラムを延期するには、イベント ループを使用する必要があります。
イベント ループを使用すると、非同期プログラミングが可能になるため、複数のタスクを同時に進行させることができます。
イベント ループにより、メモリオーバーヘッドが最小限に抑えられます。 各スレッドは、個別のスタックのメモリ オーバーヘッドを処理します。 Linux スタックは仮想メモリを使用して割り当てられ、オンデマンドで上限まで増加するため、固定コストは発生しません。 そのため、追加のリソース コストのために、Azure Sphere MT3620 などの制約付きシステムにスレッドを実装するのが難しくなります。
スレッド間の同期は複雑であり、デッドロックなどの問題につながる可能性があります。 この点で、イベント ループの方が簡単です。
実行可能な場合はイベント ループを使用することをお勧めしますが、アプリケーションにスレッドが必要な場合、Azure Sphere では POSIX pthreads がサポートされます。 スレッド セーフな実行を確保するのはアプリケーションの責任です。 一部の applibs 関数に対するアプリケーション呼び出しはスレッド セーフですが、ヘッダー ファイルに示されているように、スレッド セーフでない関数もあります。 ヘッダー ファイルがスレッド セーフメンションしない場合は、関連する関数またはライブラリがスレッド セーフでないと想定する必要があります。