2013-03-06 17 views

risposta

14
  1. Motivo tecnico: la maggior parte dei tipi atomici non garantisce il blocco. La rappresentazione del tipo atomico potrebbe dover contenere un mutex incorporato e i mutex non sono copiabili.

  2. Motivo logico: cosa significherebbe copiare un tipo atomico? Ci si aspetta che l'intera operazione di copia sia atomica? La copia e l'originale rappresentano lo stesso oggetto atomico?

Non esiste un significato ben definito per un'operazione che si estende su due oggetti atomici separatamente che lo renderebbero utile. L'unica cosa che puoi fare è trasferire il valore caricato da un oggetto atomico in un altro. Ma il carico si sincronizza direttamente solo con altre operazioni sull'oggetto precedente, mentre l'archivio si sincronizza con le operazioni sull'oggetto di destinazione. E ogni parte può venire con vincoli di ordine di memoria completamente indipendenti.

L'ortografia di un'operazione come un carico seguito da un negozio lo rende esplicito, mentre un compito lascerebbe uno chiedendosi come si rapporta alle proprietà di accesso alla memoria degli oggetti partecipanti. Se insisti, puoi ottenere un effetto simile combinando le conversioni esistenti di std::atomic<..> (richiede un cast esplicito o un altro intermedio del tipo di valore).

.

19

Su piattaforme senza istruzioni atomiche (o senza istruzioni atomiche per tutte le dimensioni integer) i tipi potrebbero dover contenere un mutex per fornire l'atomicità. I mutex non sono generalmente copiabili o mobili.

Per mantenere un'interfaccia coerente per tutte le specializzazioni di std::atomic<T> su tutte le piattaforme, i tipi non sono mai copiabili.

+1

+1, Ho sentito che questo era il motivo, anche se non ero abbastanza sicuro di inviare una risposta. Forse vale la pena menzionare la funzione membro 'is_lock_free()', che dovrebbe dire se un'implementazione si basa effettivamente su istruzioni atomiche –

+0

Penso che tu ne abbia appena parlato :) grazie. JoergB offre anche una buona (seconda) ragione, che non ho potuto esprimere a parole, quindi non ho cercato di spiegare –

Problemi correlati