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

Adding elements to global vector of vectors of structs

我有一个结构向量的全局向量,这种形式:

vector<vector<stackEntry>> shadowStacksVector

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

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

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

其中 tdata 是包含线程本地存储的结构。 我想做的是为每个线程提供对堆栈条目向量的引用,以便每个线程都可以将元素添加到自己的堆栈或从中删除元素。 从概念上讲,我相信 push_back 会复制元素,所以我认为这应该有效。但是,当我尝试 tdata->shadowStack 中的 add/remove 个元素时,我的程序崩溃了。

相反,如果我用这样的数组替换向量的向量:

vector<stackEntry> shadowStacksVector[256]

一切正常。

容器不是线程安全的,您需要创建线程安全的代码段以在多个线程中使用它们。使用 std::mutexstd::atomic 创建线程安全的代码段。

std::vectorstd::list 都不是线程安全的。您的 std::vector 失败可能是因为当您 push_back 新值时,其分配的内存可以重新分配,并且所有元素都可以在内存的其他部分移动,因此您的旧指针可以指向旧的损坏数据。如果您将在开始时使用 shadowStacksVector->reserve(MAX_INTERNAL_VECTORS_COUNT) 向量的内存将不会在您执行 push_back 时重新分配,它保证 std::vector 为 MAX_INTERNAL_VECTORS_COUNT 保留内存下一次重新分配可能会在您 push_back MAX_INTERNAL_VECTORS_COUNT+1 个元素之后发生。

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