Estoy intentando compartir una imagen, que solo se usa solo lectura, entre subprocesos. Normalmente hago este tipo de cosas con boost :: shared_ptrs, pero como cv :: Mat ya es un contenedor de conteo de referencia debajo, he intentado usarlo de la misma manera suponiendo que es seguro para subprocesos basado en las referencias a seguridad de subprocesos en referencia a contar aquí:Es cv :: Mat thread-safe (asignación atómica + refcounting)?
sin embargo he estado teniendo problemas con que podrían posiblemente indican que están de hecho no seguro para subprocesos; esa asignación no es atómica. Ocasionalmente obtendré un seg-fault dentro de un incremento de recuento de referencia que implica que el objeto original ya ha sido destruido.
Así que la pregunta concreta es:
- es la asignación cv :: Mat atómica?
Eso no parece ser atómico. El 'si' podría volverse verdadero, podría ocurrir un cambio de contexto, podría ocurrir una liberación y destruir, y luego el contexto retrocedería y CV_XADD segmentaría la falla, a menos que me faltara algo. – Catskul
CV_XADD es un conjunto de prueba atómica (por lo tanto, prueba el recuento antes de agregarlo). la primera parte (si es refcount) está ahí para una prueba rápida antes de ingresar al estado op atómico. – Sam
Además, este código, como sé, es lanzado por los chicos de Google.No creo que cometan un error así. – Sam