il programma è strutturato come nell'esempio citato appena sopra.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.
Facendo delle prove ho notato che si sblocca ma chiaramente per essere tranquillo ho applicato la medesima soluzione ad entrambi i thread.
Stranamente se inserisco una attesa nel thread 2 di 5 millisecondi in questo modocodice://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);
//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" );

Rispondi quotando