std :: vector, потокобезопасность, многопоточность

Я использую std :: vector в качестве общих данных в многопоточном приложении. Я инкапсулирую поток внутри класса, например,

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) {} 
}

Когда я закрываю приложение, иногда , в отладке будет 2 сообщения об ошибке, иногда ошибки не будет Сообщения. Я часто слышал, как люди говорят о том, что std :: vector не является потокобезопасным, это один из случаев? Я использую Visual Studio 2008, поток ускорения, размер вектора фиксированный. Может ли кто-нибудь дать совет о том, как использовать std :: vector в многопоточном приложении.

  1. Исключение при первой возможности по адресу 0x7688b9bc в ETP.exe: Microsoft C ++ исключение: std :: out_of_range в ячейке памяти 0x02d8f7bc ..
  2. Первое исключение в 0x00e916e0 в ETP.exe: 0xC0000005: Доступ место чтения нарушения 0x00000008.
  3. Ошибка подтверждения второго шанса: файл c: \ program files (x86) \ microsoft visual studio 9.0 \ vc \ include \ vector, вторая строка Ошибка утверждения вероятности: файл c: \ program files (x86) \ microsoft Visual Studio 9.0 \ vc \ include \ vector98

Спасибо.

7
задан Alexey Kukanov 16 February 2012 в 04:44
поделиться