C++ 在AD中的读取向量之间插入元素
低于样本的碰撞 当thread print正在读取向量时,在线程插入得到循环并在切换回thread print程序carashes后插入一些元素之间,如何克服此问题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_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
}