在theads中的向量中读取之间插入元素

时间:2016-01-25 12:52:52

标签: c++ multithreading c++14

以下示例崩溃 当线程打印正在读取向量并且在线程插入之间转换并在切换回线程打印程序崩溃后插入一些元素,如何克服这个问题

// Thread_vector.cpp 
//

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <thread>


//thead insert
using namespace std;
void insert_elements(vector<int> & v) {
    for (int i = 1; i < 20; i++) {
        v.push_back(i);
        cout << " : inserted - " << i << "  ";
    }

}
//thead print

void print_elements(vector<int> & vec) {
    for (auto & p:vec)
    {
        std::cout << p << "  ";
    }
    cout << endl;
}

int main()
{
    std::vector<int> b;
    thread ins(insert_elements, std::ref(b));
    thread prn(print_elements, std::ref(b));
    ins.join();
    prn.join();

    return 0;
}

情形:

  1. 不知道要提前插入的元素数量

  2. 想要并行读取和插入

  3. 一旦读取线程开始,在读取之间插入元素

1 个答案:

答案 0 :(得分:0)

您可以将std::shared_lock用于阅读主题,将std::unique_lockstd::lock_guard用于插入主题。

cppreference:

  

类shared_lock是通用共享互斥锁所有权   包装器允许延迟锁定,定时锁定和锁定传输   所有权。锁定shared_lock会锁定关联的共享互斥锁   共享模式(以独占模式锁定它,std :: unique_lock可以   使用)

std::shared_mutex rwmutex;

void insert_elements(std::vector<int> & v) {
    std::unique_lock<std::shared_mutex> read_lock(rwmutex); // or std::lock_guard
    //change actions
}

void print_elements(vector<int> & vec) {
    std::shared_lock<std::shared_mutex> write_lock(rwmutex);
    //read actions
}