C++ 在AD中的读取向量之间插入元素

C++ 在AD中的读取向量之间插入元素,c++,multithreading,c++14,C++,Multithreading,C++14,低于样本的碰撞 当thread print正在读取向量时,在线程插入得到循环并在切换回thread print程序carashes后插入一些元素之间,如何克服此问题 // Thread_vector.cpp // #include "stdafx.h" #include <vector> #include <iostream> #include <thread> //thead insert using namespace std; void inse

低于样本的碰撞 当thread print正在读取向量时,在线程插入得到循环并在切换回thread print程序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;
}
//Thread\u vector.cpp
//
#包括“stdafx.h”
#包括
#包括
#包括
//thead插件
使用名称空间std;
无效插入_元素(矢量和v){
对于(int i=1;i<20;i++){
v、 推回(i);

您可以对读取线程使用
std::shared\u lock
,对插入线程使用
std::unique\u lock
std::lock\u guard

类shared_lock是一种通用的共享互斥锁所有权 允许延迟锁定、定时锁定和锁转移的包装器 所有权。锁定共享\u锁将在中锁定关联的共享互斥锁 共享模式(要将其锁定为独占模式,可以使用std::unique\u lock (已使用)

std::shared_mutex rwmutex;
void insert_元素(std::vector&v){
std::unique_lock read_lock(rwmutex);//或std::lock_guard
//改变行动
}
无效打印元素(矢量和矢量){
std::共享锁写锁(rwmutex);
//阅读动作
}

使用上述共享互斥逻辑,它要么全部读取并全部写入,要么全部写入并全部读取。但我知道如何在线程函数中的for循环之间切换线程1.启动read for loop print_元素,2.切换回insert elements 3.然后切换回线程中的完整read for循环,因为有时会发生重新分配恩,试着记住你的号码,然后得到以下信息
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
}