Существует общий вектор с данными для доступа двумя потоками.Но при запуске ниже кода.Я получил сообщение об ошибке Ошибка сегментации (дамп ядра) .Здесь 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();
}