【发布时间】:2018-10-08 23:56:36
【问题描述】:
我有一个这种形式的结构向量的全局向量:
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]
一切正常。
【问题讨论】:
-
如果你想要每个线程一个向量,它可以是一个线程局部向量。是否有组件需要访问其他线程的向量?
-
当您启动所有这些主机时,一旦外部向量由于扩展而调整大小,所有先前的指针都无用,留在以太中。
reserve初始大小,不要再修改了。更好的是,按值发送初始向量并使用移动语义将它们保留在每个线程的本地。 IOW,摆脱shadowStacksVector。如果您需要它来获得结果,请在线程完成之前让每个线程在互斥锁的保护下安全地将它们推入。 -
或者您可以获取向量列表
-
@Kapil 使用向量列表有效!这是为什么呢?