【问题标题】:c++ vector assign() method fails frequentlyc++向量assign()方法经常失败
【发布时间】:2015-02-26 14:03:23
【问题描述】:

我有一个浮点向量,它在运行时使用 assign() 方法多次调整大小和清空,但每次我切换到较小的大小时它都会失败并抛出异常 Vector subscript out of range

声明:

std::vector<float> buffer;
size_t size, c;

设置大小和删除旧内容:

void SetBuffersize(size_t sz)
{
  // Resize vector
  // buffer.resize(sz); // really not needed?

  // Delete old content
  buffer.assign(sz, 0);
}

有一个线程在运行,不断地访问这个向量:

void Process()
{
  if (++c >= size) c = 0;
  float out = buffer[c];
  // do something with out;
}

另一个线程可以调整缓冲区的大小:

void ChangeStatus(int n)
{
  size = size_table[n];
  SetBuffersize(size);
}

我通过添加一个标志来解决问题,该标志在调整矢量大小时阻止Process() 函数。有没有更好的解决方案来避免实时线程中额外的if 语句的开销?

【问题讨论】:

  • 什么抛出异常?
  • 我认为您需要包含更具体的代码。尝试生成可以重现问题的最小版本。
  • 大小总是正数吗?不管怎样:你知道调整大小不会缩小内存中的向量吗?
  • but it often fails?多常?可复制?是否有另一个线程访问该向量?
  • vinod sahu 的评论:(缓冲区)向量是否被多个线程使用?是否有任何情况下您调用 SetBuffersize 并同时调用其他一些线程修改缓冲区?

标签: c++ vector thread-safety assign


【解决方案1】:

您似乎总是有竞争条件:

  • 假设 size=10 且 c=5
  • Process 将条件评估为假
  • ChangeStatus 清除向量
  • Process 尝试在 size=0 的向量上获取 buffer[c]

并发访问数据时必须小心。你需要的是一种原子性,看看信号量、锁等。如果你需要性能,你可以看看自旋锁。 http://en.wikipedia.org/wiki/Spinlock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多