【问题标题】:Adding elements to global vector of vectors of structs将元素添加到结构向量的全局向量
【发布时间】:2018-10-08 23:56:36
【问题描述】:

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

vector<vector<stackEntry>> shadowStacksVector

我们的想法是每个线程都有一个vector&lt;stackEntry&gt;

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

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

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

另一方面,如果我用这样的数组替换向量的向量:

vector<stackEntry> shadowStacksVector[256]

一切正常。

【问题讨论】:

  • 如果你想要每个线程一个向量,它可以是一个线程局部向量。是否有组件需要访问其他线程的向量?
  • 当您启动所有这些主机时,一旦外部向量由于扩展而调整大小,所有先前的指针都无用,留在以太中。 reserve初始大小,不要再修改了。更好的是,按值发送初始向量并使用移动语义将它们保留在每个线程的本地。 IOW,摆脱shadowStacksVector。如果您需要它来获得结果,请在线程完成之前让每个线程在互斥锁的保护下安全地将它们推入。
  • 或者您可以获取向量列表
  • @Kapil 使用向量列表有效!这是为什么呢?

标签: c++ intel-pin


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多