将元素添加到结构向量的全球向量中

Adding elements to global vector of vectors of structs

本文关键字:向量 结构 元素 添加      更新时间:2023-10-16

i具有此形式的构建式向量的全局向量:

vector<vector<stackEntry>> shadowStacksVector

想法是每个线程的vector<stackEntry>

在线程启动函数中我执行以下操作:

vector<stackEntry> sstack;
shadowStacksVector.push_back(sstack);
tdata->shadowStack = &(shadowStacksVector.back());

其中tdata是包含线程本地存储的结构。我想做的是,对于每个线程,请参考堆栈条目的向量,以便每个线程可以将元素添加或删除到自己的堆栈中。从概念上讲,我相信push_back会执行该元素的副本,因此我认为这应该可以起作用。但是,当我尝试添加/删除tdata->shadowStack中的元素时,我的程序崩溃了。

在偏见上,如果我用这样的数组替换向量的向量:

vector<stackEntry> shadowStacksVector[256]

一切正常。

容器不是线程安全的,您需要创建代码的线程安全部分才能在多个线程中与它们一起使用。使用std::mutexstd::atomic创建代码的线程安全部分。

std::vectorstd::list都不是线程安全。您的std::vector可能失败,可能是因为当您按下新值时,其分配的内存可以进行重新分配,并且所有元素都可以在内存的其他部分移动,因此您的旧指针可以指向旧的损坏数据。如果您在开始向量向量的内存处使用shadowStacksVector->reserve(max_internal_vectors_count(,当您进行push_back时,将不会重新定位,它可以保证std :: vector保留的内存用于max_internal_vectors_count和next Reallocate,并且在您将在您将push upl upher push_back_back_internal_vectors_vectors_count_count_count_count 1 emelts。>

std::list不需要重新分配他的所有元素,因为它的元素可以存储在内存的不同部分,每次您进行push_back时,它都会为每个元素分配内存,因此旧的指针在同一内存位置上是指的。<<<<<<<<<<