gpt4 book ai didi

c++ - 将元素添加到结构 vector 的全局 vector

转载 作者:行者123 更新时间:2023-11-28 01:34:11 25 4
gpt4 key购买 nike

我有一个这种形式的结构 vector 的全局 vector :

vector<vector<stackEntry>> shadowStacksVector

想法是有一个 vector<stackEntry>每个线程。

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

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

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

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

vector<stackEntry> shadowStacksVector[256]

一切正常。

最佳答案

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

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

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

关于c++ - 将元素添加到结构 vector 的全局 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50074233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com