为同一向量C ++运行多个线程时出现分段错误

时间:2018-06-10 10:07:25

标签: c++ multithreading c++11 mutex

有一个共享向量,数据可供两个线程访问。但是在代码下运行时。我收到错误提到分段错误(核心转储)。这里std::vector<json> outputOfStealthAddresses是共享向量。在这里,我要做的是每个线程需要从向量中获取第一个值并将其本地存储在线程中,然后将其从向量中移除(避免从每个线程双重使用)。在这里,我使用互斥锁来锁定向量。然后将本地存储的数据传递给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 :(得分:0)

您需要使用互斥锁保护对vector方法的所有调用。具体来说,empty()来电。

答案 1 :(得分:0)

至于你的具体问题:

您需要使用互斥锁来锁定矢量上的所有操作。

至于你实际上似乎试图解决的问题: 我假设你想通过并行化来加速你的sqlite插入? 如果是这样:这不会解决您的性能问题。你应该做的是: 将您的插入作为单个事务进行。