C++ 线程安全标准::向量推回和保留

C++ 线程安全标准::向量推回和保留,c++,multithreading,vector,C++,Multithreading,Vector,我有一个应用程序,它不断地将std::vector::push_元素推回到一个向量中。由于它是一个实时系统,我不能让它在任何时候都停止运行。不幸的是,当保留内存耗尽时,push_-back自动内存分配确实会导致我的测量暂停高达800毫秒 我通过使用第二个线程来解决这个问题,该线程监视可用内存的时间,并在必要时调用std::vector::reserve 我的问题是:同时执行保留和推回是安全的吗 显然是在假定push_back不会重新分配内存的情况下 谢谢 没有 线程安全概念只存在于C++11中。

我有一个应用程序,它不断地将std::vector::push_元素推回到一个向量中。由于它是一个实时系统,我不能让它在任何时候都停止运行。不幸的是,当保留内存耗尽时,push_-back自动内存分配确实会导致我的测量暂停高达800毫秒

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

我的问题是:同时执行保留和推回是安全的吗

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

谢谢

没有

线程安全概念只存在于C++11中。它是根据常数定义的。在C++11中,标准库const现在意味着线程安全。这两个方法都不是常量,因此不是,它不是线程安全的。


线程安全概念只存在于C++11中。它是根据常数定义的。在C++11中,标准库const现在意味着线程安全。这两个方法都不是常量,因此不,它不是线程安全的。

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


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

这不是线程安全的,因为向量是连续的,如果它变大,则可能需要将向量的内容移动到内存中的其他位置



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

在我的书中,使用可能通过分配内存和要求实时语义而增长的数据结构是一个矛盾。内存分配的持续时间没有固定的上限。显然,您使用了错误的数据结构。您需要一个并发的、非阻塞的队列。不幸的是,标准库没有提供它。你可以使用线程构建块库。在我的书中,使用一个可能通过分配内存和要求实时语义而增长的数据结构是一个矛盾。内存分配的持续时间没有固定的上限。显然,您使用了错误的数据结构。您需要一个并发的、非阻塞的队列。不幸的是,标准库没有提供它。您可以使用线程构建块库。这不是它不是线程安全的唯一原因。即使没有重新分配,类不变量也很容易被破坏。并发访问期间的任何写入都是未定义的行为。没错,但这说明了海报希望做什么这一更大的问题,为什么即使同步向量也不能解决问题。这可能会让OP认为只要没有重新分配就没有问题。OP的问题不是关于重新分配吗?看起来突出显示的部分并不是他真正想问的。他认为我的回答是正确的,这支持了那个结论OP现在只知道这是不能为手头的任务使用std::vector的一个充分条件。这不是它不是线程安全的唯一原因。即使没有重新分配,类不变量也很容易被破坏。并发访问期间的任何写入都是未定义的行为。没错,但这说明了海报希望做什么这一更大的问题,为什么即使同步向量也不能解决问题。这可能会让OP认为只要没有重新分配就没有问题。OP的问题不是关于重新分配吗?看起来突出显示的部分并不是他真正想问的。他认为我的回答是正确的,这支持了那个结论OP现在只知道这是不能为手头的任务使用std::vector的一个充分条件。。。。什么这是非常非常错误的。首先,只要有线程,线程安全的概念就一直存在。C++11为std::thread带来了库支持,但线程本身一直存在,请参见。此外,虽然通常在线程环境中调用const方法是安全的,但由于const方法不能改变状态,非const方法肯定可以是线程安全的。我们不能指着一个没有标记为const的方法说它一定是线程不安全的。@MichaelDorst标准C++98/C++03中不存在线程的概念。抽象机器基本上是单线程的。这
课程与现实世界直接冲突。因此,编译器实现者忽略了标准的这一方面,并用线程的概念来增强语言。在此基础上,出现了pthreads之类的线程库。C++11首先将线程的概念引入到语言中。在此基础上,它带来了“std::threads”的库支持。请参阅有关常数和线程安全的信息。在一次CppCon谈话中解释说,在标准库中,由于C++11,所有const方法当然都是线程安全的,它们可能应该在标准中指定这一点。除非另有规定,否则当方法为常量时,它是线程安全的。我记不起是哪一次谈话了。我有一个怀疑是这样的:,但我没有时间浏览它。这只对std有效。是的,这显然是正确的,因为任何不改变程序状态的代码(const就是这个意思)都必须是线程安全的。然而,并非所有未标记const的方法都是线程安全的。您说过它们不是线程安全的,因为它们没有标记为const,这是错误的。确实,它们不是线程安全的,但这不是原因。您答案的读者可能会得到这样的印象,即他们可以根据操作是否标记为const来判断操作的线程安全性。虽然const的存在确实表示线程安全,但不存在它并不表示线程不安全。这方面的一个很好的例子是。此操作变异状态,因此不是常量,但变异保证是原子的,因此是线程安全的。。。。什么这是非常非常错误的。首先,只要有线程,线程安全的概念就一直存在。C++11为std::thread带来了库支持,但线程本身一直存在,请参见。此外,虽然通常在线程环境中调用const方法是安全的,但由于const方法不能改变状态,非const方法肯定可以是线程安全的。我们不能指着一个没有标记为const的方法说它一定是线程不安全的。@MichaelDorst标准C++98/C++03中不存在线程的概念。抽象机器基本上是单线程的。这当然是与现实世界的直接冲突。因此,编译器实现者忽略了标准的这一方面,并用线程的概念来增强语言。在此基础上,出现了pthreads之类的线程库。C++11首先将线程的概念引入到语言中。在此基础上,它带来了“std::threads”的库支持。请参阅有关常数和线程安全的信息。在一次CppCon谈话中解释说,在标准库中,由于C++11,所有const方法当然都是线程安全的,它们可能应该在标准中指定这一点。除非另有规定,否则当方法为常量时,它是线程安全的。我记不起是哪一次谈话了。我有一个怀疑是这样的:,但我没有时间浏览它。这只对std有效。是的,这显然是正确的,因为任何不改变程序状态的代码(const就是这个意思)都必须是线程安全的。然而,并非所有未标记const的方法都是线程安全的。您说过它们不是线程安全的,因为它们没有标记为const,这是错误的。确实,它们不是线程安全的,但这不是原因。您答案的读者可能会得到这样的印象,即他们可以根据操作是否标记为const来判断操作的线程安全性。虽然const的存在确实表示线程安全,但不存在它并不表示线程不安全。这方面的一个很好的例子是。此操作变异状态,因此不是常量,但变异保证是原子的,因此是线程安全的。