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

时间:2018-04-28 07:54:53

标签: c++ intel-pin

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

vector<vector<stackEntry>> shadowStacksVector

其中的想法是每个线程都有一个vector<stackEntry>

在线程启动功能中,我执行以下操作:

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

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

在contary上,如果我用这样的数组替换向量向量:

vector<stackEntry> shadowStacksVector[256]

一切正常。

1 个答案:

答案 0 :(得分:2)

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

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

std::list不需要重新分配他的所有元素,因为它的元素可以存储在内存的不同部分,每次你执行push_back时它为每个元素分配内存,所以旧的指针指向同一个地方记忆。