Mi serve il parere di una persona che ne sa davvero, non capisco cosa sto sbagliando o comunque cosa sta succedendo. Volevo mettere un post su http://www.delphiedintorni.it ma oggi non funziona.

Ho un'applicazione multithread che tra le varie cose scrive su un file di testo ciò che accade. La procedura
che scrive sul file è sottoposta a CriticalSection di modo che i threads non aprano contemposaneamente il file di log insieme.
A volte capita (tipo una volta al mese) che un thread venga tenuto bloccato dalla CriticalSection a lungo, oggi addirittura per 20 minuti. Poi scrive ciò che deve e prosegue il suo lavoro come nulla fosse. Il fatto è che in quei 20 minuti comunque gli altri threads hanno eseguito la procedura correttamente per cui la CriticalSection non era bloccata ma è stato il thread a non accorgersi di quando la procedura si è liberata.
Può essere che il sistema operativo sospenda l'esecuzione di un thread quando è oberato di lavoro proprio quando il thread incontra una CriticalSection bloccata?

Io uso le CriticalSection così:

codice:
...OnCreate()
	InitializeCriticalSection(TCSLog);
	...


procedure .....
begin
	EnterCriticalSection(TCSLog);
	...
	...
	LeaveCriticalSection(TCSLog);
end;