Ho una risorsa comune, che voglio 1 e solo 1 istanza della mia applicazione (o la sua API COM) per avere accesso in qualsiasi momento. Ho provato a proteggere questa risorsa usando i mutex, ma quando più thread di un'applicazione host dotnet tentano di accedere all'oggetto COM, il mutex non sembra essere rilasciato. Questo è il codice che ho usato per proteggere la mia risorsa.Come si protegge una risorsa comune utilizzando mutex?
repeat
Mutex := CreateMutex(nil, True, PChar('Connections'));
until (Mutex <> 0) and (GetLastError <> ERROR_ALREADY_EXISTS);
try
//use resource here!
finally
CloseHandle(Mutex);
end;
Se corro i fili simultaneamente, il primo filo di ottenere attraverso (ovviamente, essendo il primo a creare il mutex), ma thread successivi vengono catturati nel ciclo di ripetizione. Se eseguo ogni thread a intervalli di 5 secondi, tutto va bene.
Ho il sospetto che non sto usando correttamente i mutex qui, ma ho trovato pochissima documentazione su come farlo.
Qualche idea?
Devo aggiungere che funziona solo se imposto il secondo parametro di CreateMutex su True. In caso contrario, ho lo stesso problema di prima con i thread appesi, ognuno in attesa l'uno dell'altro. – Steve
Dispari. La chiamata WaitForSingleObject dovrebbe acquisire il mutex per te. L'esempio MSDN utilizza anche False: http://msdn.microsoft.com/en-us/library/ms686927%28VS.85%29.aspx –
Craig ha ragione. La mia raccomandazione è di * mai * passare 'True' per il secondo parametro. Il motivo è che quando la funzione ritorna, non hai idea se possiedi effettivamente il mutex. Inoltre, al momento della creazione, probabilmente non è necessario possedere il mutex comunque. Crea il mutex * una volta * all'avvio del programma. Quindi acquisire e rilasciarlo mentre il programma viene eseguito. Quando il programma termina, chiudere la maniglia. Non creare e distruggere il mutex ogni volta che è necessario possederlo. –