c ++ vector assign()方法经常失败

时间:2014-12-30 11:46:12

标签: c++ vector thread-safety assign

我有一个浮点数向量,在运行时使用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语句的开销?

1 个答案:

答案 0 :(得分:1)

似乎你总是有竞争条件:

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

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