Supponiamo che esista una funzione EventHandler
chiamata su più thread in momenti diversi.
EventHandler
deve chiamare SomeOtherFunction
, ma queste chiamate devono avvenire solo su un thread alla volta.
Ciò significa: se una chiamata a SomeOtherFunction
è attualmente attiva sul thread A e EventHandler
viene richiamata di nuovo (su qualche altro thread B), quindi SomeOtherFunction
non deve essere richiamato sul thread B, ma SomeOtherFunction
deve essere chiamato quando ritorna sul thread A.
Qualcosa di simile a questo (pseudo-codice):
function EventHandler()
{
numberPendingCallsSemaphore.Release(); // increase
if (mayCallSemaphore.Acquire()) // (i)
{
while (numberPendingCallsSemaphore.Acquire()) // decrease
{
SomeOtherFunction();
}
// (ii)
mayCallSemaphore.Release();
}
}
Ovviamente, questo codice non funziona a causa di una gara: un thread è in posizione (ii) con mayCallSemaphore
ancora preso e un altro in posizione (i) non è in grado di prendi mayCallSemaphore
.
Ho scritto codice funzionante usando un lucchetto, ma il codice è piuttosto lungo e brutto. Dall'altro, questo problema sembra piuttosto semplice a prima vista, quindi:
C'è una soluzione semplice e potenzialmente semplice per questo che non ero in grado di trovare o che al momento non vedo?