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



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

// 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. 读取
  4. 线程开始后,在读取之间插入元素

您可以使用

std::shared_lock读取线程和std::unique_lockstd::lock_guard插入线程。

CPP 首选项:

类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
}

最新更新