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" );