lockfree
は、標準 C++11 で記述されたロックフリー データ構造のコレクションであり、深く埋め込まれたプラットフォームから HPC まで、すべてのプラットフォームに適しています。
ロックフリー データ構造は、相互排他メカニズムを使用する必要がなく、同時使用に対してスレッドと割り込みが安全なデータ構造です。これらはプロセス間通信に最も役立ち、多くの場合、操作とスレッドの数に応じてロックベースの構造よりもはるかに拡張性が優れています。
lockfree
を使用する理由これらのデータ構造はパフォーマンスが優れているため、データをプッシュするスレッド/割り込みが 1 つだけあり、データを取得するスレッド/割り込みが 1 つだけある場合には、一般に使用する必要があります。
これらのデータ構造はより一般的で、複数のプロデューサーとコンシューマーを同時にサポートしますが、単一のプロデューサーと単一のコンシューマーのデータ構造と比較すると、ストレージとパフォーマンスのオーバーヘッドがあります。また、一部のローエンド マイクロコントローラーでは欠落している可能性のあるアトミック命令も必要です。
ライブラリを入手するには主に 3 つの方法があります。
lockfree
デフォルトでインデックスのキャッシュライン アライメントを使用してフォールス シェアリング現象を回避し、キャッシュ コヒーレント システムでのキャッシュラインの無効化によるパフォーマンスの損失を回避します。これにより、デフォルトでインデックスがLOCKFREE_CACHELINE_LENGTH
の64
に整列されます。
組み込みシステムでは、メモリの無駄を避けるために、 LOCKFREE_CACHE_COHERENT
ほとんどの場合false
に設定する必要があります。
さらに、一部のシステムではキャッシュラインの長さが一般的ではないため (たとえば、Apple M1/M2 CPU のキャッシュライン長は 128 バイト)、そのような場合にはLOCKFREE_CACHELINE_LENGTH
それに応じて設定する必要があります。
lockfree
のデータ構造はすべて、単純な型に使用することのみを目的としています。
ホスト環境でロックフリーのデータ構造を使用する最大の理由は、デッドロック、優先度の逆転、非決定的なアクセス遅延などのロックに関連する問題を回避することです。ロックフリーのデータ構造を適切に使用すると、一部のシナリオでパフォーマンスを向上させることもできます。
さらに、 lockfree
、 #ifdef
やポリモーフィズムを使用せずに、POSIX 環境と非 POSIX 環境の両方で動作するようにコンパイルできるアプリケーションとライブラリを構築する方法を提供します。
通常、マイクロコントローラーなどの組み込みシステムではロックは高価ではありませんが、RTOS にはさまざまな種類があり、ロック用の標準化された API はありません。 8051からRISC-Vまで複数のアーキテクチャが存在するということは、割り込み管理方法も標準化されていないことを意味します。
lockfree
、 lockfree
とは対照的に、無視できるパフォーマンス コストで移植可能な組み込みコードを構築する方法を提供します。lockfree を使用したコードは、C++11 をサポートする任意の組み込みプラットフォームで実行するようにコンパイルできます。さらに、コードはモックを必要とせずにホスト マシン上で簡単にテストできます。
lockfree
におけるデータ構造の正式な分類は何ですか? lockfree
のすべての構造は境界あり、配列ベースでロックフリーであり、spsc データ構造もwaitfreeで安全に終了します。
ロックフリープログラミングについて詳しく知りたい場合は、以下をご覧ください。