Używam std :: vector jako wspólne dane w aplikacji wielowątkowej. I hermetyzacji nitkę wewnątrz klasy, npstd :: wektor, wątek bezpieczeństwa, wielowątkowość
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) {}
}
Kiedy zamknąć aplikację, czasami w debugowania, będą 2 komunikaty o błędach czasami nie będzie żadnych komunikatów o błędach. Często słyszałam, że ludzie mówiący o std :: vector nie są bezpieczni dla wątków, czy to jest jeden z przypadków? Używam Visual Studio 2008, zwiększ wątek, rozmiar wektora jest naprawiony. Czy ktoś może również zaoferować porady dotyczące sposobu użycia std :: vector w aplikacji wielowątkowej.
- Pierwsza szansa wyjątek w 0x7688b9bc w ETP.exe: Microsoft C++ wyjątek: std :: out_of_range w lokalizacji pamięci 0x02d8f7bc ..
- Pierwsza szansa wyjątek w 0x00e916e0 w ETP.exe: 0xc0000005: Dostęp lokalizacja odczytu naruszenia 0x00000008.
- Second Chance Assertion Failed: Plik C: \ program files (x86) \ Microsoft Visual Studio 9.0 \ VC \ include \ wektor, Linia drugie Chance Assertion Failed: Plik C: \ program files (x86) \ Microsoft wizualny studio 9.0 \ vc \ include \ vector98
Dzięki.
wektor nie jest wątku bezpieczne, jeśli spróbujesz napisać do niego w tym samym czasie z różnych wątków to złamie. Blokujesz go i bez innych kodów, aby zobaczyć, jak go używasz, nie można powiedzieć, co może być nie tak. Ten konkretny kod sam w sobie wygląda dobrze. – Jarryd
Oprócz bezpieczeństwa nici, prawdopodobnie musisz również wziąć pod uwagę sekwencję, w której twoje nici mają dostęp do wektora, Jeśli jeden wątek czyta z wektora, powinieneś upewnić się, że drugi wątek zapisał się do wektora przed lub co najmniej kod powinien obsługiwać warunek, dla którego wektor nie został zapisany. –
@Jarryd jesteś rytuałem, w tym kodzie wydaje się, że blokuje wektor używając muteksa, jeśli to robi, to nie powinno to powodować problemu, ponieważ szczegóły musimy przejść przez kompletny kod –