Ошибка сегментации при запуске нескольких потоков для одного вектора C ++ - PullRequest
0 голосов
/ 10 июня 2018

Существует общий вектор с данными для доступа двумя потоками.Но при запуске ниже кода.Я получил сообщение об ошибке Ошибка сегментации (дамп ядра) .Здесь std::vector<json> outputOfStealthAddresses - общий вектор.Здесь я делаю, каждый поток должен получить первое значение из вектора и сохранить его локально в потоке, а затем удалить его из вектора (избегать двойного использования из каждого потока).Здесь я использовал mutex для блокировки вектора.Затем локально сохраненные данные передаются в соединение SQLite для вставки данных в базу данных.

Примечание - Здесь я использую два соединения SQLite для каждого потока.

Вот две функции резьбы.

Функция резьбы 1

void runSaDataStoreThread1(){
    //creating sqlite connection
    indexMapper::indexes dbConnectionSA ("file", "sub-file","data" ,true );    //init database instance globally

    //create data table for tx details
    dbConnectionSA.createTable(saDetailTable);

    while (true){
        if(!outputOfStealthAddresses.empty()){
            std::vector<json> temp;
            mtx.lock();
                if(!outputOfStealthAddresses.empty()){
                    temp.push_back(outputOfStealthAddresses[0]);
                    outputOfStealthAddresses.erase(outputOfStealthAddresses.begin());
                }
            mtx.unlock();

            if(!temp.empty()){
                dbConnectionSA.insertSAData(temp[0]);
            }

            temp.erase(temp.begin());
        }else if(outputOfStealthAddresses.empty() && isAllBlockDone){
            break;
        }
    }
    dbConnectionSA.close();
}

Функция резьбы 2

void runSaDataStoreThread2(){
    //creating sqlite connection
    indexMapper::indexes dbConnectionSA1 ("file", "sub-file","data-2" ,true );    //init database instance globally

    //create data table for tx details
    dbConnectionSA1.createTable(saDetailTable);

    while (true){
        if(!outputOfStealthAddresses.empty()){
            std::vector<json> temp2;

            mtx.lock();
            if(!outputOfStealthAddresses.empty()){
                temp2.push_back(outputOfStealthAddresses[0]);
                outputOfStealthAddresses.erase(outputOfStealthAddresses.begin());
            }
            mtx.unlock();

            if(!temp2.empty()){
                dbConnectionSA1.insertSAData(temp2[0]);
            }

            temp2.erase(temp2.begin());
        }else if(outputOfStealthAddresses.empty() && isAllBlockDone){
            break;
        }
    }
    dbConnectionSA1.close();
}

основная функция

int main(){
  auto thread11 = std::thread(parse::runSaDataStoreThread1);
  auto thread16 = std::thread(parse::runSaDataStoreThread2);

  thread11.join();
  thread16.join();
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

как для вашей конкретной проблемы:

вам нужно использовать мьютекс для блокировки всех операций над вашим вектором.

относительно проблемы, которую вы на самом деле пытаетесь решить: я предполагаю, что выхотите ускорить вставку sqlite, распараллеливая их?Если так: это не решит проблему с производительностью.то, что вы должны сделать, это сделать ваши вставки как одну транзакцию.

0 голосов
/ 10 июня 2018

Вам нужно защитить все вызовы векторных методов с помощью мьютекса.В частности, empty() звонки.

...