线程安全std :: vector push_back和reserve

时间:2014-04-25 09:07:30

标签: c++ multithreading vector

我有一个应用程序,它持续 std :: vector :: push_back 元素到一个向量中。由于它是一个实时系统,我无法在任何时候停止。不幸的是,当保留的内存耗尽时,push_back自动内存分配确实会导致停顿(在我的测量中最多800毫秒)。

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

  

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

(显然假设push_back不会重新分配内存)

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

没有

线程安全概念仅存在于C ++ 11中。它是根据const定义的。在C ++ 11中,标准库const现在意味着thread-safe。这两种方法都不是const,所以不,它不是线程安全的。