C++ 11 でマルチスレッド アプリケーションを作成するときに、いくつのオプションがあるかをよりよく理解するために、さらに深く掘り下げようとしています。
要するに、これまでのところ、この 3 つのオプションが表示されます。
- 明示的なロックおよび解放メカニズムを備えたミューテックスは、ロックおよび解放によってスレッドの同期を維持します。これにはコストがかかり、コードの実行順序が保証されませんが、多くの場合、このソリューションは異なるメモリ モデル間で非常に移植性があります。
- アトミック操作。アトミック = 1 競合のない単一の操作であり、常に一貫性があるため、同期はロックと解放なしで達成されます。競合なしでロックする必要はありません。高度に最適化されたアトミック操作を使用しますが、アトミックは依然として私のコードが実行される順序。
- フェンスを使用すると、コード内にコンパイラが並べ替えできないブロックが作成され、柔軟性が低くなり、実際に何が実行されているかを常に監視する必要があるため、コードのメンテナンスの面でコストがかかる傾向があります。しかし、これらはキャッシング技術も改善します。この 3 つのソリューションの中で、おそらく最も予測可能な動作を持つソリューションです。
これは多かれ少なかれ、スレッドとメモリ モデルに関する最初のレッスンから得たものの核心です。私の問題は次のとおりです。
柔軟性と優れたパフォーマンスを実現するために、ロックフリーのデータ構造とアトミックを使用していました。ここでの問題は、明らかに X86 マシンが ARM マシンとは異なる方法でメモリの並べ替えを実行するという事実であり、コードの移植性を可能な限り維持したいと考えています。少なくともこの 2 つのプラットフォーム間では、2 つのプラットフォームが同じ並べ替えメカニズムを持つことが保証されていない場合、移植可能なマルチスレッド ソフトウェアを作成するためにどのようなアプローチを提案できますか? それとも、今のところアトミック操作が最良の選択であり、私はこれをすべて間違っていますか?
たとえば、Intel TBB ライブラリ (C++11 コードではない) が ARM/Android に移植され、atomic 専用の部分が大幅に変更されていることに気付きました。そのため、移植可能なマルチスレッド コードを C+ で記述できる可能性があります。 +11、ロックフリーのデータ構造を使用し、後でライブラリを別のプラットフォームに移植するときにアトミックに関する部分を最適化しますか?