我有一个应用程序,可以连续地将 std::vector::push_back 元素放入向量中。由于它是一个实时系统,我不能让它随时停止。不幸的是,当保留内存耗尽时,push_back 自动内存分配确实会导致停顿(在我的测量中最多 800 毫秒)。
我通过使用一个第二个线程来解决这个问题,该线程监视何时可用内存并在必要时调用std::vector::reserve。
我的问题是:同时执行reserve和push_back是否安全?
(显然是在假设push_back不会重新分配内存的情况下)
谢谢!
它不是线程安全的,因为向量是连续的,如果它变大,那么你可能需要将向量的内容移动到内存中的不同位置。
正如 stefan 所建议的,您可以查看非阻塞队列或拥有向量列表(或向量),这样当您需要更多空间时,另一个线程可以为您保留一个新向量,同时不会阻塞原始向量进行查找。您只需要重新映射索引即可查找列表中正确的向量。
答案就在 C++ 标准中。检查 std::vector::reserve():
void Reserve( size_type new_cap ) :如果new_cap大于capacity(),则所有迭代器,包括end()迭代器,以及对元素的所有引用都将失效。否则,迭代器或引用不会失效。
同样:
void push_back( T&& value ) :如果操作后新的 size() 大于旧的capacity(),则会发生重新分配,在这种情况下,所有迭代器(包括 end() 迭代器)和对元素的所有引用均作废。否则只有 end() 迭代器无效。
所以不,这些操作不是线程安全的。
没有。
线程安全概念仅存在于C++11中。它是相对于
const
定义的。在 C++11 标准库中,const
现在表示 thread-safe
。这两种方法都不是 const
,所以不,它不是线程安全的。