質問

目的

私は、移植性が最大の関心事である小さなライブラリを書いています。ほとんど準拠しているC90(ISO / IEC 9899:1990)環境のみを想定して設計されています...ライブラリが提供する一連の関数はすべて、内部データ構造で動作(読み取り/書き込み)します。私は他のデザインの代替案を検討しましたが、ライブラリが何であるかについて実行可能なように見えるものは他にありません達成しようとしています

質問

スレッドセーフを保証するために使用できる移植可能なアルゴリズム、テクニック、または呪文はありますか?関数を再入可能にすることには関心がありません。さらに、アルゴリズム/技術/呪文が移植可能である場合、速度や(おそらく)リソースの浪費は気にしません。理想的には、ライブラリ(GNU Pthなど)やシステム固有の操作(アトミックテストアンドセットなど)に依存したくないのです。

Lamportのベーカリーアルゴリズムを変更することを検討しましたが、その方法がわかりませんスレッド自体で動作するのではなく、スレッドによって呼び出される関数内で動作するように変更します。

ご協力ありがとうございます。

役に立ちましたか?

解決

Lamportのベーカリーアルゴリズムはおそらく機能します。残念ながら、まだ実用的な問題があります。特に、多くのCPUは out-of-orderメモリ操作を実装しています。コードを完全に正しい命令シーケンスにコンパイルした場合、CPUは、コードを実行するときに、パフォーマンスを向上させるために命令をその場で並べ替えることを決定する場合があります。これを回避する唯一の方法は、メモリバリアを使用することです。固有。

実際には、2つの選択肢しかありません。(1)ライブラリをスレッドセーフにせず、ドキュメント内でユーザーに認識させるか、(2)プラットフォーム固有のミューテックスを使用します。オプション2は、さまざまなプラットフォーム用のmutexを実装し、統一された抽象的なインターフェースを提供する別のライブラリを使用することで簡単に作成できます。

他のヒント

少なくともアトミックCASであるOS /ハードウェアサポートなしでは、実用的なことは何もできません。ただし、さまざまなプラットフォームを共通のインターフェイスに抽象化するポータブルライブラリが あります。

http://www.gnu.org/software/pth/related.html

最近では、ほとんどすべてのシステム(Windowsを含む)がlibpthreadを実行できます。

関数は、どのように見たいかに応じて、スレッドセーフにすることも、本質的にスレッドセーフにすることもできません。また、スレッド化/ロックは本質的にプラットフォーム固有です。本当に、スレッドの問題を処理するのはライブラリのユーザーです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top