线程安全std::向量push_back和reserve

问题描述 投票:0回答:3

我有一个应用程序,可以连续地将 std::vector::push_back 元素放入向量中。由于它是一个实时系统,我不能让它随时停止。不幸的是,当保留内存耗尽时,push_back 自动内存分配确实会导致停顿(在我的测量中最多 800 毫秒)。

我通过使用一个第二个线程来解决这个问题,该线程监视何时可用内存并在必要时调用std::vector::reserve

我的问题是:同时执行reserve和push_back是否安全?

(显然是在假设push_back不会重新分配内存的情况下)

谢谢!

c++ multithreading vector
3个回答
3
投票

它不是线程安全的,因为向量是连续的,如果它变大,那么你可能需要将向量的内容移动到内存中的不同位置。

正如 stefan 所建议的,您可以查看非阻塞队列或拥有向量列表(或向量),这样当您需要更多空间时,另一个线程可以为您保留一个新向量,同时不会阻塞原始向量进行查找。您只需要重新映射索引即可查找列表中正确的向量。


0
投票

答案就在 C++ 标准中。检查 std::vector::reserve():

void Reserve( size_type new_cap ) :如果new_cap大于capacity(),则所有迭代器,包括end()迭代器,以及对元素的所有引用都将失效。否则,迭代器或引用不会失效。

同样:

void push_back( T&& value ) :如果操作后新的 size() 大于旧的capacity(),则会发生重新分配,在这种情况下,所有迭代器(包括 end() 迭代器)和对元素的所有引用均作废。否则只有 end() 迭代器无效。

所以不,这些操作不是线程安全的。


-11
投票

没有。

线程安全概念仅存在于C++11中。它是相对于

const
定义的。在 C++11 标准库中,
const
现在表示
thread-safe
。这两种方法都不是
const
,所以不,它不是线程安全的。

© www.soinside.com 2019 - 2024. All rights reserved.