Dato che ero un po 'confuso, comincio chiarendo alcuni concetti nella domanda.
Raccolta . Non vedo alcun motivo per dedicare del tempo a definire rigorosamente cosa significa "raccolta" quando possiamo semplicemente chiedere cosa succede per le strutture di dati in generale. Una struttura di dati occupa un pezzo di memoria e ha alcune operazioni che possono accedere a tale memoria e che possono essere invocate dagli utenti . Questi utenti possono essere processori distinti o semplicemente thread diversi, non ci riguardano. Tutto ciò che conta è che possano eseguire operazioni in parallelo.
Senza serratura . Herlihy e Boss affermano che una struttura di dati è priva di blocchi quando un utente in crash non impedisce ulteriori usi della struttura di dati. Ad esempio, immagina di versare acqua su un processore che si trova nel mezzo dell'inserimento di un nodo in un set ordinato. Bene, se altri processori tentano successivamente di inserirsi in quel set ordinato, dovrebbero riuscire. ( Edit: Secondo questa definizione, è il caso che se utilizza una struttura dati serrature, allora non è-serratura libera, ma è non il caso che se una struttura di dati non utilizza serrature allora è senza blocchi.)
Con queste definizioni, penso che Herlihy e Boss sostengano sostanzialmente che la risposta è trasformare le regioni critiche in transazioni.
Ma, potresti chiedere, ha la stessa complessità? Non sono sicuro che la domanda abbia un senso. Prendere in considerazione push(x) { lock(); stack[size++] = x; unlock(); }
. È un'operazione a tempo costante? Se si ignora l'operazione di blocco e quindi altri utenti, è possibile rispondere SÌ. Se non desideri ignorare altri utenti, non c'è davvero modo di dire se push verrà eseguito a tempo costante. Se salite di un livello e vedete come lo stack viene utilizzato da un determinato algoritmo, allora potreste essere in grado di dire che push richiederà sempre tempo costante (misurato ora in termini di qualunque cosa accada sia l'input del vostro algoritmo parallelo). Ma questa è davvero una proprietà del tuo algoritmo, quindi non ha senso dire che push è un'operazione a tempo costante.
In breve, se si ignora quanto un utente che esegue un'operazione attende altri utenti, l'utilizzo delle transazioni anziché delle aree critiche risponde affermativamente alla domanda. Se non si ignora il tempo di attesa, è necessario esaminare come viene utilizzata la struttura dei dati.