Hallo
Ich (Wir) arbeiten an einer Multithreaded Applikation mit Borland C++ Builder 2006. Dabei gibt es einen Background Thread der gewisse Tasks abarbeitet. Diese Tasks werden dem Thread von einem anderen Thread übermittelt.
Zur Synchronisation benutze ich dazu relativ ausgiebig die Klasse TCriticalSection (ich benutze dazu eine Instanz von TCriticalSection welche über eine Singleton Klasse an die Methoden/Klassen zurückgegeben wird, um gewisse Codeabschnitte zu sichern.
Leide habe ich in meiner Applikation nun einen Deadlock, den ich nicht verstehe. Wenn ich nichts übersehen habe wird jede kritische Codesektion die mit einem Enter() Statement beginnt auch wieder released (Leave). Evtl. verstehe ich die Handhabung/Funktion von TCriticalSection noch nicht ganz. Darum hier ein paar Fragen anhand des untenstehenden Code-Snippets:
TcriticalSection criticalSection;
void Methode1{
criticalSection.Enter();
Methode2();
criticalSection.Leave();
}
void Methode2{
criticalSection.Enter();
...
criticalSection.Leave();
}
1. sind verschachtelte criticalSections möglich? (benutze ich in meinem Code)
Falls ja, wo muss man speziell Acht geben?
2. in obigem Beispiel wird in Methode1 wird nach dem Enter-Statement Methode1 aufgerufen in der wiederum ein Enter-Statement aufgerufen wird und anschliessend ein Leave Statement.
2a: Was bewirkt das 2. Enter Statment (gar nichts da ja schon in einer kritischen Sektion / das locking wird verstärkt (a la semaphoren), dass heisst jetzt müssen 2. Leave statements folgen damit andere threads auf kritische Bereiche (von dieser TCriticalSection beschützt) zugreifen können.
2b: Was macht das Leave-Statement in Methode2
- es hebt nur das Enter-Statement von Metode2 auf
- es hebt das alle EnterStatements auf (Methode1+2), Was macht dann das Leave-Statement in Methode1
3. Wo kann es sonst noch Deadlocks geben. Ich denke gemenisame Resourchen sind nur das gesharte Memory (das ja eben geschützt werden sollte) und allenfalls die Datenbank (aber hier gibt es ja einen TimeOut)
In Bezug auf C++ bin ich leider noch recht grün hinter den Ohren und dankbar für jede Hilfe
Gruss Dani
Ich (Wir) arbeiten an einer Multithreaded Applikation mit Borland C++ Builder 2006. Dabei gibt es einen Background Thread der gewisse Tasks abarbeitet. Diese Tasks werden dem Thread von einem anderen Thread übermittelt.
Zur Synchronisation benutze ich dazu relativ ausgiebig die Klasse TCriticalSection (ich benutze dazu eine Instanz von TCriticalSection welche über eine Singleton Klasse an die Methoden/Klassen zurückgegeben wird, um gewisse Codeabschnitte zu sichern.
Leide habe ich in meiner Applikation nun einen Deadlock, den ich nicht verstehe. Wenn ich nichts übersehen habe wird jede kritische Codesektion die mit einem Enter() Statement beginnt auch wieder released (Leave). Evtl. verstehe ich die Handhabung/Funktion von TCriticalSection noch nicht ganz. Darum hier ein paar Fragen anhand des untenstehenden Code-Snippets:
TcriticalSection criticalSection;
void Methode1{
criticalSection.Enter();
Methode2();
criticalSection.Leave();
}
void Methode2{
criticalSection.Enter();
...
criticalSection.Leave();
}
1. sind verschachtelte criticalSections möglich? (benutze ich in meinem Code)
Falls ja, wo muss man speziell Acht geben?
2. in obigem Beispiel wird in Methode1 wird nach dem Enter-Statement Methode1 aufgerufen in der wiederum ein Enter-Statement aufgerufen wird und anschliessend ein Leave Statement.
2a: Was bewirkt das 2. Enter Statment (gar nichts da ja schon in einer kritischen Sektion / das locking wird verstärkt (a la semaphoren), dass heisst jetzt müssen 2. Leave statements folgen damit andere threads auf kritische Bereiche (von dieser TCriticalSection beschützt) zugreifen können.
2b: Was macht das Leave-Statement in Methode2
- es hebt nur das Enter-Statement von Metode2 auf
- es hebt das alle EnterStatements auf (Methode1+2), Was macht dann das Leave-Statement in Methode1
3. Wo kann es sonst noch Deadlocks geben. Ich denke gemenisame Resourchen sind nur das gesharte Memory (das ja eben geschützt werden sollte) und allenfalls die Datenbank (aber hier gibt es ja einen TimeOut)
In Bezug auf C++ bin ich leider noch recht grün hinter den Ohren und dankbar für jede Hilfe
Gruss Dani
Comment