c vector assign()方法经常失败

c vector assign()方法经常失败,第1张

概述我有一个浮点数向量,在运行时使用assign()方法调整大小并清空多次,但每次切换到较小的大小时,它都会失败,抛出异常向量下标超出范围. 声明: std::vector<float> buffer;size_t size, c; 设置大小并删除旧内容: void SetBuffersize(size_t sz){ // Resize vector // buffer.resize(sz 我有一个浮点数向量,在运行时使用assign()方法调整大小并清空多次,但每次切换到较小的大小时,它都会失败,抛出异常向量下标超出范围.

声明:

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语句的开销?

解决方法 看来你总是有竞争条件:

>假设size = 10且c = 5
> Process将条件评估为false
> ChangeStatus清除向量
>进程尝试在size = 0的向量上获取缓冲区[c]

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

总结

以上是内存溢出为你收集整理的c vector assign()方法经常失败全部内容,希望文章能够帮你解决c vector assign()方法经常失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227451.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存