Domanda

Quando ho voglia di tenere traccia delle connessioni attive, è meglio salvarli nella lista collegata o direttamente ad alcuni array in cui indice rappresenterà ID del collegamento? Voglio evitare possibili problemi di condizione corsa, ad esempio:

  • numero di connessioni nella lista è grande
  • qualcuno inizia a cercare un collegamento che si trova alla fine della lista
  • Nel frattempo, durante la ricerca, la connessione viene staccato
È stato utile?

Soluzione

La struttura dovrebbe avere una maniglia connessione (socket), un conteggio di riferimento, e un flag che indica che la connessione deve essere chiusa e l'oggetto eliminato il più presto possibile. Qualunque sia il contenitore è esso deve avere meccanismo di sincronizzazione (sezione critica) per la ricerca / inserire / rimuovere, e la logica getReference / uscita. Funzione getReference deve restituire NULL se si alza la bandiera di chiusura. Potrebbe essere necessario più di un getReference, a seconda delle condizioni di ricerca (e oggetto di connessione dovrebbe avere tutti quei valori che possono aiutare a fermo trovato nel contenitore). Una delle funzioni getReference in grado di creare nuovo oggetto se esso non esiste in un contenitore.

funzione di rilascio dovrebbe chiudere la connessione ed eliminare l'oggetto dal contenitore se la bandiera chiusura è sollevato e conteggio dei riferimenti è sceso a zero. Tuttavia uscita non deve chiudere la connessione all'interno della sezione critica, perché questo può richiedere molto tempo di funzionamento (dipende dal chiusura regolare e persistente opzione ). Uscita dovrebbe entrare CS, conteggio di riferimento diminuzione, se è zero, allora lasciare CS, stretta connessione, inserire CS di nuovo, e l'oggetto rimuovere dal contenitore ed eliminarlo. Perché il flag di chiusura viene sollevato il conteggio dei riferimenti non alzerà tra due CS di.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top