Christian Schmitt
2015-03-05 08:08:18 UTC
Hallo Community,
ich bin relativ neu auf dem Gebiet der Threads, muß mich damit aber jetzt zwangsläufig auseinandersetzen. Ich habe auch schon ein wenig gelesen und mich daraufhin entschlossen mit Critical Sections zu arbeiten. Dazu hätte ich 2 Fragen an euch:
Habe ich es richtig verstanden, dass ein lesender Variablenzugriff kein Problem darstellt? Oder anders herum gefragt: Kann es zu Problemen kommen, wenn ich ohne Critical Section Variablen mit mehreren Threads auslese?
Bisher habe ich es so gelöst, dass jeder Thread eine eigene Critical Section hat. Allerdings bekomme ich ab und an timing probleme, da ja jeweils immer nur ein Thread diese Section bearbeiten darf (Was ja auch der Sinn ist).
Beispiel: Es sind 2 kritische Variablen A und B definiert, die beide von mehreren Threads benutzt werden sollen. Wenn ich nun zum setzen von A die Critical Section betrete, muß der zweite Thread auch warten, wenn er nur Variable B setzen möchte, da ja auch hierfür die CS betreten werden muß. Das würde ich gerne durche mehrere CS verhindern. Spricht da etwas dagegen? Eventuell sogar neue Klassen erfinden nach dem Motto
type
TCriticalString=class
private
FCriticalSection:TCriticalSection;
FValue:String;
procedure FSetValue(S:String);
function FGetValue:String;
public
property Value:String read FGetValue write FSetValue;
end;
...
Procedure FSetValue(S:String);
begin
FCriticalSection.Enter;
FValue:=S;
FCriticalSection.Leave;
end;
Function FGetValue:result;
begin
FCriticalSection.Enter; //Oder hier nicht, je nach dem was Ihr zu Frage 1 sagt :-)
Result:=FValue;
FCriticalSection.Leave;
end;
Oder handele ich mir damit andere Probleme ein?
Gruß
ich bin relativ neu auf dem Gebiet der Threads, muß mich damit aber jetzt zwangsläufig auseinandersetzen. Ich habe auch schon ein wenig gelesen und mich daraufhin entschlossen mit Critical Sections zu arbeiten. Dazu hätte ich 2 Fragen an euch:
Habe ich es richtig verstanden, dass ein lesender Variablenzugriff kein Problem darstellt? Oder anders herum gefragt: Kann es zu Problemen kommen, wenn ich ohne Critical Section Variablen mit mehreren Threads auslese?
Bisher habe ich es so gelöst, dass jeder Thread eine eigene Critical Section hat. Allerdings bekomme ich ab und an timing probleme, da ja jeweils immer nur ein Thread diese Section bearbeiten darf (Was ja auch der Sinn ist).
Beispiel: Es sind 2 kritische Variablen A und B definiert, die beide von mehreren Threads benutzt werden sollen. Wenn ich nun zum setzen von A die Critical Section betrete, muß der zweite Thread auch warten, wenn er nur Variable B setzen möchte, da ja auch hierfür die CS betreten werden muß. Das würde ich gerne durche mehrere CS verhindern. Spricht da etwas dagegen? Eventuell sogar neue Klassen erfinden nach dem Motto
type
TCriticalString=class
private
FCriticalSection:TCriticalSection;
FValue:String;
procedure FSetValue(S:String);
function FGetValue:String;
public
property Value:String read FGetValue write FSetValue;
end;
...
Procedure FSetValue(S:String);
begin
FCriticalSection.Enter;
FValue:=S;
FCriticalSection.Leave;
end;
Function FGetValue:result;
begin
FCriticalSection.Enter; //Oder hier nicht, je nach dem was Ihr zu Frage 1 sagt :-)
Result:=FValue;
FCriticalSection.Leave;
end;
Oder handele ich mir damit andere Probleme ein?
Gruß