Originariamente inviato da linoma
Forse usando degli eventi non autoresettanti riesci, ma molto dipende da cm hai organizzato il tuo programma, se si verificano delle situazioni di deadlock molto probabilmente i solo eventi nn bastano.
il programma è strutturato come nell'esempio citato appena sopra.
Facendo delle prove ho notato che si sblocca ma chiaramente per essere tranquillo ho applicato la medesima soluzione ad entrambi i thread.
codice:
//thread1
WaitForSingleObject(hEvent1,INFINITE);
if(capita qualcosa)
SetEvent(hEvent2); //risveglio il secondo thread
ResetEvent(hEvent1); // metto in attesa il primo thread
if (
WaitForSingleObject(hEvent1,0) == WAIT_TIMEOUT &&
WaitForSingleObject(hEvent2,0) == WAIT_TIMEOUT
)
SetEvent (hEvent1);
//thread2
WaitForSingleObject(hEvent2,INFINITE);
eseguo il compito assegnatomi
SetEvent(hEvent1); //risveglio il primo thread
ResetEvent(hEvent2); // metto in attesa il secondo thread
if (
WaitForSingleObject(hEvent1,0) == WAIT_TIMEOUT &&
WaitForSingleObject(hEvent2,0) == WAIT_TIMEOUT
)
SetEvent (hEvent2);
Stranamente se inserisco una attesa nel thread 2 di 5 millisecondi in questo modo
//thread2
WaitForSingleObject(hEvent2,INFINITE);
eseguo il compito assegnatomi
SetEvent(hEvent1); //risveglio il primo thread
Sleep(5);
ResetEvent(hEvent2); // metto in attesa il secondo thread
Sembra che lo stallo non si verifichi mai!
gli eventi NON sono autoresettanti (oregon ne sa qualcosa in quanto ne avevamo già discusso)
hEvent1 = CreateEvent ( NULL , true , false , "Event 10234" );
hEvent2 = CreateEvent ( NULL , true , false , "Event 11234" );