【发布时间】: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