100 項目タイプのレコードを持つ静的配列があります。
TMy_Array:array[1..100] of T;
ここで、T は次のとおりです。
T = record
A: double;
B: Date;
C: String;
end;
n
要素を変更する同様のスレッドがありますTMy_Array
TMy_Array[n].A;
TMy_Array[n].B;
TMy_Array[n].C)`.
N
に近い100
です。
また、任意のフィールドを選択的に変更する 10 のスレッドもありますTMy_Array
。これを安全に達成するには、クリティカルセクションを使用する必要があります。ここで質問があります。
クリティカル セクションを 1 つだけ使用することで、競合するスレッドや配列へのアクセスを待機するスレッドが過密になることはありませんか?
おそらく、T_Array 内の特定の項目へのアクセスを保護し、他のスレッドをブロックしない 100 個のクリティカル セクションを適用できますか、または適用する必要がありますか?
Var
Cs:array [1..100] of TRTLCriticalSection;
//then for n-thread:
EnterCriticalSection(CS[n]);
TMy_Array[n].A:=…;
TMy_Array[n].B:=…;
TMy_Array[n].C:=…;
LeaveCriticalSection(CS[n]);
これは良い考えですか?アプリケーションが過負荷になりませんか?
そして2番目の質問:
TDateTime
(本当にDouble
) とString
アトミック データですか? 別のスレッドが書き込みを行っている間の競合を心配することなく、それらを読み取る (読み取るだけ) ことはできますか?