将元素添加到结构向量的全局向量
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::mutex
或 std::atomic
创建线程安全的代码段。
std::vector
和 std::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,所以旧指针都指向同一个内存位置。
我有一个结构向量的全局向量,这种形式:
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::mutex
或 std::atomic
创建线程安全的代码段。
std::vector
和 std::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,所以旧指针都指向同一个内存位置。