Sto tentando di condividere un'immagine, che viene utilizzata solo in sola lettura, attraverso i thread. Tipicamente faccio questo genere di cose con boost :: shared_ptrs ma dato che cv :: Mat è già un contenitore di conteggio di riferimento sotto, ho cercato di usarlo nello stesso modo assumendo che sia thread-safe basato sui riferimenti alla sicurezza dei thread in riferimento a contare qui:È cv :: Mat thread safe (assegnazione atomica + refcounting)?
Tuttavia sto avendo avendo problemi che potrebbero, eventualmente, indicano che essi sono infatti non thread-safe; quell'assegnazione è non atomica. Occasionalmente avrò un errore seg in un incremento del conteggio dei riferimenti che implica che l'oggetto originale è già stato distrutto.
Quindi la domanda specifica è:
- È assegnazione cv :: Mat atomica?
Questo non sembra essere atomico. 'If' potrebbe restituire true, potrebbe verificarsi un cambio di contesto, una release e destroy potrebbe accadere, e quindi il contesto tornerà indietro e CV_XADD sarebbe segfault, a meno che manchi qualcosa. – Catskul
CV_XADD è un test-and-set atomico (quindi, verifica il conto prima di aggiungere). la prima parte (se refcount) è lì per un test veloce prima di entrare nello stato op atomico. – Sam
Inoltre, questo codice, come so, viene rilasciato dai ragazzi di Google.Non penso che farebbero un simile errore. – Sam