10

'boolean'変数は、任意のスレッドからの読み取りと書き込みに対してスレッドセーフですか?私はそれらがそうであると言うためにいくつかのニュースグループの参照を見ました。他のデータ型は利用できますか?(列挙型、おそらく短いint?)

任意のスレッドから安全に読み取ることができるすべてのデータ型のリストと、さまざまな同期方法に頼ることなく任意のスレッドで安全に書き込むことができる別のリストがあると便利です。

4

5 に答える 5

8

これはデータ型がスレッドセーフかどうかの問題ではなく、データ型をどうするかという問題です。ロックがなければ、値のロード、変更、書き戻しを含むスレッドセーフな操作はありません。数値のインクリメントまたはデクリメント、セット内の要素のクリアまたは設定 - これらはすべてスレッドセーフではありません。

アトミック操作を可能にする多くの関数があります: 連動インクリメント、連動デクリメント、および連動交換です。これは一般的な概念であり、Windows、x86、または Delphi に固有のものではありません。Delphi の場合、Windows API の InterlockedFoo() 関数を使用できます。それらのラッパーもいくつかあります。または、自分で書いてください。関数は整数で動作するため、アトミックなインクリメント、デクリメント、および整数 (32 ビット) の交換を行うことができます。

アセンブラーとプレフィックス ops を lock プレフィックスと共に使用することもできます。

詳細については、この StackOverflowの質問も参照してください。

于 2009-02-04T06:51:31.747 に答える
4

32 ビット アーキテクチャでは、適切にアラインされた 32 ビット以下のデータ型のみをアトミックと見なす必要があります。32 ビット値は 4 アラインされている必要があります (データのアドレスは 4 で割り切れる必要があります)。おそらく、このようなタイトなレベルでインターリーブに遭遇することはありませんが、理論的には、ダブル、Int64、または拡張非アトミック書き込みを行うことができます。

于 2009-02-04T06:33:22.827 に答える
3

マルチコア RISC 処理と個別のコア キャッシュ メモリが最新のプロセッサに組み込まれているため、「些細な」高水準言語の読み取りまたは書き込み構造 (またはそのことについては、何度も何度も) が必要になることはなくなりました。 a-time 8086 'atomic' アセンブリ命令) はアトミックと見なすことができます。実際、アセンブラ命令がアトミックになるように特別に設計されていない限り、おそらくアトミックではありません。これには、メモリ読み取りのほとんどのメカニズムが含まれます。アセンブラ レベルでの長整数の読み取りでさえ、同じメモリを共有し、RISC プロセッサ レベルで非同期キャッシュ更新アクションを使用している別のプロセッサ コアからの同時書き込みによって破損する可能性があります。複数の RISC コアを備えたプロセッサでは、アセンブリ言語の命令でさえ、事実上単なる「高レベル」のコード命令であることに注意してください。それらがビット レベルでどのように実装されているかを実際に知ることはできません。また、古い 8086 (シングル コア) アセンブラー マニュアルを読んでいた場合、期待したものとはまったく異なる可能性があります。Windows にはネイティブ システム互換のアトミック オペレーターが用意されています。

Windows オペレーターを使用する理由 Windows が最初に行うことの 1 つは、実行されているマシンが何であるかを確立することです。それが正しいことを保証する重要な側面の 1 つは、どのようなアトミック操作があり、どのように機能するかです。自分のコードを将来のどのプロセッサでも問題なく動作させたい場合は、このすべての作業を独自のコードで複製する (そして常に更新する) か、Windows が起動時に既にすべての作業を行っているという事実を利用することができます。次に、実行時に必要なコードを API に組み込みました。

アトミック操作に関する MSDN ページをお読みください。Windows API がこれらを表示します。それらは時々ぎこちなく、または不器用に見えるかもしれません - しかし、それらは将来の証拠であり、缶に書かれている通りに常に正確に機能します.

どうすればこれを知ることができますか? そうでなければ、Windows を実行できなくなるからです。フルストップ。独自のコードを実行してもかまいません。

コードを記述するときは常に、Parsimonyを理解し、 Occam の剃刀を検討することをお勧めします。つまり、Windows が既にそれを行っており、コードで Windows を実行する必要がある場合は、機能するかどうかわからない多くの代替の、ますます複雑化する仮想ソリューションを試すのではなく、Windows が既に行っていることを使用してください。それ以外のことをするのは、ただの時間の無駄です (もちろん、それがあなたの目的である場合を除きます)。

于 2016-03-11T14:18:14.190 に答える
1

Indy コードには、IdThreadSafe.pas にいくつかのアトミック/スレッド セーフ データ型が含まれています。

  • TIdThreadSafeInteger
  • TIdThreadSafeBoolean
  • TIdThreadSafeString
  • TIdThreadSafeStringList など...
于 2009-03-21T18:49:26.680 に答える