2009-04-28 7 views

答えて

8

TThread子孫自体がそれらを変更することはなく、できるだけ早く初期化することを意味している場合は、すべてが正常になります(スレッドが生存していることを確認し、プロパティ値を要求するたびに蹴ります)。

"読み取り専用プロパティ"によって、TThread子孫がそれらを変更する唯一のものである場合は、メインスレッドが変更されている間にそれらを読み取らないようにする必要があります(ただし、 、整数のように)。

+0

完璧な回答!正確に私が必要とした情報。私はTThread子孫の内部から値を更新していますが、すべての値がアトミックではありません。あなたの答えをありがとう。 –

+1

であり、コードが32ビットで整列されていない場合は、整数などの「原子」値さえも失敗する可能性があります。 –

+0

Indyには、IdThreadSafeInt64やTIdThreadSafeBooleanを含むCore \ IdThreadSafe.pasのいくつかの原子データ型が含まれています – mjn

3

IntegerBooleanChar、およびPointerのような基本タイプは、いつでも読むのが安全です。 string、インタフェース、動的配列などの参照型は、他のスレッドが同時に新しい値を割り当てる可能性がない場合にのみ、読み込みが安全です。たとえば、クリティカルセクションまたはSynchronizedメソッドを使用して、メインスレッドが値を変更していないことを確認します。

読み込んだ値は、使用するまでに古くなっている可能性があることを覚えておく必要があります。スレッドは、読み込んだときから使用するまでの間に新しい値を書き込んでいる可能性があります。

+0

私はそれが "同期"と呼ばれると信じています(最後にDはありません) –

2

これは、プロパティの種類によって、場合によってはアクセサメソッドによって異なります。

type 
    TMyThread = class(TThread) 
    private 
    FIntfield: integer; 
    public 
    property IntField: integer read FIntField; 
    end; 

32ビット値へのアクセスはアトミックな操作であるため、このプロパティへのアクセスは問題にはなりません。しかし、プロパティが32ビットより大きい場合、またはメインスレッドがアクセスする間に変更される可能性のあるクラス参照の場合、問題が発生します。

関連する問題