Estoy usando std :: vector como datos compartidos en una aplicación multiproceso. I encapsular el hilo dentro de una clase, por ejemplo,std :: vector, thread-safety, multi-threading
class ABC {
public:
double a, b, c;
};
boost::mutex mutex1;
class XYZ {
public:
XYZ(vector<ABC> & pVector) {
ptrVector = &pVector;
m_thread = boost::thread(&XYZ::Start, this);
}
~XYZ() {}
void Start();
public:
vector<ABC> * ptrVector;
boost::thread m_thread;
};
void XYZ::Start() {
try {
while(1) {
boost::this_thread::interruption_point();
for (unsigned int i=0; i<ptrVector->size(); i++) {
{
boost::mutex::scoped_lock lock(mutex1);
ptrVector->at(i).a = double(rand())/10000;
ptrVector->at(i).b = double(rand())/10000;
ptrVector->at(i).c = double(rand())/10000;
}
}
}
}
catch(boost::thread_interrupted) {}
catch(std::exception) {}
}
Al cerrar la aplicación, veces, en la depuración, habrá 2 mensajes de error, veces habrá ningún mensaje de error. A menudo escuché gente hablando de que std :: vector no es seguro para subprocesos, ¿es este uno de los casos? Estoy usando Visual Studio 2008, aumentar el hilo, el tamaño del vector es fijo. ¿Alguien puede ofrecer también algunos consejos sobre cómo usar std :: vector en una aplicación multiproceso?
- excepción de primera oportunidad en 0x7688b9bc en ETP.exe: Microsoft C++ excepción: std :: out_of_range en la posición de memoria 0x02d8f7bc ..
- excepción de primera oportunidad en 0x00e916e0 en ETP.exe: 0xc0000005: Acceso ubicación de lectura de violación 0x00000008.
- la segunda oportunidad de aserción: El archivo c: \ archivos de programa (x86) \ Microsoft Visual Studio 9.0 \ VC \ include vector \, línea Segunda Probabilidad de aserción: El archivo c: \ archivos de programa (x86) \ Microsoft visual estudio 9.0 \ vc \ include \ vector98
Gracias.
vector no se hilo de seguridad, si se intenta escribir en él al mismo tiempo desde diferentes hilos y luego se romperá. Sin embargo, lo está bloqueando, y sin otro código para ver cómo lo está usando, es imposible determinar qué podría estar yendo mal. Este código particular en sí mismo se ve bien. – Jarryd
Además de la seguridad del hilo, probablemente también deba tener en cuenta la secuencia en la que sus hilos acceden al vector. Si un hilo está leyendo del vector, debe asegurarse de que el otro hilo haya escrito en el vector anterior o al menos su El código debe manejar la condición de que el vector no se haya escrito. –
@Jarryd usted es rito, en este código parece que está bloqueando el vector usando mutex, si lo hace, entonces no debería causar problema, para más detalles tenemos que ir a través del código completo –