La solución más fuerte de garantía es bloquear todo el vector de todas las operaciones (que significa controlar cada operación de todas partes del código , lo que realmente significa crear un vector sincronizado).
Puede ser que algo tan simple como esto va a hacer para sus propósitos:
int append(std::vector<int>& numbers, int number){
int retval = numbers.size();
// what if some other thread calls push_back(number) in between these calls?
numbers.push_back(number);
int newSize = numbers.size();
//this bit is as a short-cut in common, easy, cases
if(newSize = retval + 1) //no need for further complication
return retval;
while(++retval < newSize)
if(numbers[retval] == number)
return retval;
//If we get this far, numbers have been deleted, not added. More discussion below.
}
Una cosa acerca de esto es que si las discusiones empujan 3, 3, 3, 3, entonces el índice devuelta será incorrecto, aunque seguirá siendo un índice de 3. Si eso está bien o no, depende de tus propósitos.
Otra es que si el vector está elevado o de otro modo acortado, mientras tanto, a continuación, en el mejor de llegar al punto en el que sólo hay que poner un comentario en el código anterior, en errores peor (ya que saltará de nuevo después de que obtenemos newSize, y luego acceder a [retval] deja de ser válido). Debe considerar si este caso puede suceder (quizás sepa por el resto del código que nunca lo hará) y qué hacer si lo hace.
Si las limitaciones de esto son demasiado grandes para su caso de uso, producir un vector totalmente sincronizado es lo mejor que puedo pensar, me temo.
En realidad, no sería fácil si push_back() devuelve un índice, como push_back() sí no es seguro para subprocesos –
Usted necesita para proteger su contenedor contra todas las escrituras concurrentes. Concurrent plain push_back() ya necesita sincronización vectorial-externa –
Tenga en cuenta que para muchas aplicaciones del mundo real, hacer pequeñas operaciones de seguridad de subprocesos no es la solución correcta: debería considerar proteger trozos de código más grandes.Las colecciones Thread-safe son buenas si las está utilizando como un mecanismo de comunicación. Dicho esto, este podría ser un caso así. –