Gast
2006-07-17, 16:14:25
Hi Leute,
ich arbeite daran, ein multithreaded MFC-Programm nach .NET zu portieren. Das Programm enthält jede menge critical Sections. In der MFC gab's dafür die Klassen CCriticalSection und CSingleLock, CCriticalSection repräsentierte das Synchronisationsobjekt, CSingleLock bot die Methoden Lock() und Unlock() zum Eröffnen und Verlassen der critical section an:
CCriticalSection cs;
// enter critical section
CSingleLock sl(&cs);
sl.Lock();
//...
// release critical section
sl.Unlock();
Der große Vorteil: man mußte Unlock() nicht notwendigerweise manuell aufrufen, die critical section wurde automatisch freigegeben, wenn die CSingleLock-Instanz gelöscht wurde, z.B. bei Verlassen des Blocks in dem sie erstellt wurde:
//...
{
// enter critical section
CSingleLock sl(&cs);
sl.Lock();
//...
// automated release of cs at end of code block
}
In .NET tritt an die Stelle von CCriticalSection die Klasse System:Threading::Mutex (es gab auch in der MFC eine Klasse CMutex, das Mutex aus .NET umfaßt offenbar beides, Mutex und critical section), die zum Eröffnen und Verlassen der critical section die Methoden WaitOne() und ReleaseMutex() zur Verfügung stellt. Obiges Codebeispiel sieht dann so aus:
System::Threading::Mutex mutex;
// enter critical section
mutex.WaitOne();
//...
// release critical section
mutex.ReleaseMutex();
Was ich jetzt gerne wissen würde wäre, ob auch .NET den Komfort einer Klasse wie CSingleLock anbietet, bei deren Deintanziieren die critical section automatisch freigegeben wird? Oder muß man das da wieder von Hand erledigen?
ich arbeite daran, ein multithreaded MFC-Programm nach .NET zu portieren. Das Programm enthält jede menge critical Sections. In der MFC gab's dafür die Klassen CCriticalSection und CSingleLock, CCriticalSection repräsentierte das Synchronisationsobjekt, CSingleLock bot die Methoden Lock() und Unlock() zum Eröffnen und Verlassen der critical section an:
CCriticalSection cs;
// enter critical section
CSingleLock sl(&cs);
sl.Lock();
//...
// release critical section
sl.Unlock();
Der große Vorteil: man mußte Unlock() nicht notwendigerweise manuell aufrufen, die critical section wurde automatisch freigegeben, wenn die CSingleLock-Instanz gelöscht wurde, z.B. bei Verlassen des Blocks in dem sie erstellt wurde:
//...
{
// enter critical section
CSingleLock sl(&cs);
sl.Lock();
//...
// automated release of cs at end of code block
}
In .NET tritt an die Stelle von CCriticalSection die Klasse System:Threading::Mutex (es gab auch in der MFC eine Klasse CMutex, das Mutex aus .NET umfaßt offenbar beides, Mutex und critical section), die zum Eröffnen und Verlassen der critical section die Methoden WaitOne() und ReleaseMutex() zur Verfügung stellt. Obiges Codebeispiel sieht dann so aus:
System::Threading::Mutex mutex;
// enter critical section
mutex.WaitOne();
//...
// release critical section
mutex.ReleaseMutex();
Was ich jetzt gerne wissen würde wäre, ob auch .NET den Komfort einer Klasse wie CSingleLock anbietet, bei deren Deintanziieren die critical section automatisch freigegeben wird? Oder muß man das da wieder von Hand erledigen?