Dipende veramente da quale semantica fornisci all'accesso membro const
.
Per le classi standard, è thread-safe per richiamare contemporaneamente membri const
da più thread. I membri in uscita const
che mutano un RNG lo interromperanno, a meno che l'RNG non sia completamente thread-safe (per uso non const
).
Non è necessario progettare le classi allo stesso modo, ma altri sviluppatori troveranno probabilmente confuso scoprire classi che non possono essere tranquillamente "lette" (invocano le funzioni membro const
) contemporaneamente.
Un'opzione consisterebbe nel fornire due varianti: una versione non const che utilizza l'RNG memorizzato internamente e una versione const
che accetta un RNG mediante riferimento non const. (Il primo può chiamare il secondo, non è richiesto const_cast
). Questo implementa la linea guida "paga solo per quello che ti serve" w.r.t thread-safety, poiché più thread possono tranquillamente utilizzare l'oggetto se ognuno fornisce un'istanza RNG locale thread. Consente inoltre di eseguire test utilizzando un'implementazione RGG fittizia, che è probabilmente ancora più preziosa.
fonte
2014-09-26 12:36:59
Potresti pubblicare un piccolo esempio? Se l'istanza 'random' non sta tentando di mutare nessuno dei membri della classe, e non è di per sé un membro, la funzione può comunque rimanere' const'. – CoryKramer
@Cyber: Sulla base della domanda sembra chiaro che l'istanza 'random' È un membro (domanda detta" elemento "). –
Una considerazione potrebbe essere la sicurezza del filo. Il metodo Const è solitamente trattato come thread-safe. quindi, se la chiamata è protetta da mutex, per me sembra che sia ok per renderlo membro mutevole, altrimenti non se c'è una minima possibilità di coinvolgere il multithreading. – dewaffled