急!vector对象输出的数据比push进去的多?

时间:2022-06-04 19:26:10
定义了一个vector对象来存放数据,不知道什么原因必须要在类的构造函数中先reserve()才能用,每40ms一次数据,来一次数据就开启线程解算然后放到vector对象中(解算时间在20ms内),结果最后输出时总是多出来很多数据,请问有什么可能的原因?多线程的问题还是vector没用对?

13 个解决方案

#1


多线程操作时要自己加锁啊,否则会出问题的

#2


引用 楼主 la9881275 的回复:
定义了一个vector对象来存放数据,不知道什么原因必须要在类的构造函数中先reserve()才能用,每40ms一次数据,来一次数据就开启线程解算然后放到vector对象中(解算时间在20ms内),结果最后输出时总是多出来很多数据,请问有什么可能的原因?多线程的问题还是vector没用对?
一定要加锁吗,临界区神马的。我想着下次数据还没到来,开启的线程就处理完了啊

#3


stl对象都是线程不安全的

#4


引用 2 楼 la9881275 的回复:
Quote: 引用 楼主 la9881275 的回复:

定义了一个vector对象来存放数据,不知道什么原因必须要在类的构造函数中先reserve()才能用,每40ms一次数据,来一次数据就开启线程解算然后放到vector对象中(解算时间在20ms内),结果最后输出时总是多出来很多数据,请问有什么可能的原因?多线程的问题还是vector没用对?
一定要加锁吗,临界区神马的。我想着下次数据还没到来,开启的线程就处理完了啊


如果vector已有元素较多,此时又超过了其size需要重分配内存,并拷贝之前的内容可能要的时间略长,你可以先看下如果加了锁之后是否正常

#5


这个多线程,你需要加锁,不是自己算时间,想当然,就不会出问题的

#6


《Windows核心编程》

#7


结果都表明了一切。
你需要加锁处理.

#8


多个线程操作同一个对象吗?

#9


引用 8 楼 VisualEleven 的回复:
多个线程操作同一个对象吗?
每40ms一次数据,来一次数据就开启线程解算然后放到vector对象中(解算时间在20ms内)。用了个全局事件对象,好像跟之前没啥变化

#10


引用 7 楼 fengqinqdca 的回复:
结果都表明了一切。
你需要加锁处理.
那怎么加合适呢?我这是对话框应用程序,定义的vector在dlg类中,要给他加锁,具体怎么做呢?谢谢

#11


引用 10 楼 la9881275 的回复:
Quote: 引用 7 楼 fengqinqdca 的回复:

结果都表明了一切。
你需要加锁处理.
那怎么加合适呢?我这是对话框应用程序,定义的vector在dlg类中,要给他加锁,具体怎么做呢?谢谢


可以使用临界区,在使用vector的成员函数时加一下锁

#12


引用 11 楼 paschen 的回复:
Quote: 引用 10 楼 la9881275 的回复:

Quote: 引用 7 楼 fengqinqdca 的回复:

结果都表明了一切。
你需要加锁处理.
那怎么加合适呢?我这是对话框应用程序,定义的vector在dlg类中,要给他加锁,具体怎么做呢?谢谢


可以使用临界区,在使用vector的成员函数时加一下锁
我试过了。用的互斥事件,还是那样的结果。前面都是正常的。就是vector数据最后是不对的结果。在开启的数据解算线程里,判断是否到达目标位置,到达时发送指令给仪器停止测量。我估计是这里出了问题,数据前面的部分都是对的。

#13


多线程用stl一定要加锁

#1


多线程操作时要自己加锁啊,否则会出问题的

#2


引用 楼主 la9881275 的回复:
定义了一个vector对象来存放数据,不知道什么原因必须要在类的构造函数中先reserve()才能用,每40ms一次数据,来一次数据就开启线程解算然后放到vector对象中(解算时间在20ms内),结果最后输出时总是多出来很多数据,请问有什么可能的原因?多线程的问题还是vector没用对?
一定要加锁吗,临界区神马的。我想着下次数据还没到来,开启的线程就处理完了啊

#3


stl对象都是线程不安全的

#4


引用 2 楼 la9881275 的回复:
Quote: 引用 楼主 la9881275 的回复:

定义了一个vector对象来存放数据,不知道什么原因必须要在类的构造函数中先reserve()才能用,每40ms一次数据,来一次数据就开启线程解算然后放到vector对象中(解算时间在20ms内),结果最后输出时总是多出来很多数据,请问有什么可能的原因?多线程的问题还是vector没用对?
一定要加锁吗,临界区神马的。我想着下次数据还没到来,开启的线程就处理完了啊


如果vector已有元素较多,此时又超过了其size需要重分配内存,并拷贝之前的内容可能要的时间略长,你可以先看下如果加了锁之后是否正常

#5


这个多线程,你需要加锁,不是自己算时间,想当然,就不会出问题的

#6


《Windows核心编程》

#7


结果都表明了一切。
你需要加锁处理.

#8


多个线程操作同一个对象吗?

#9


引用 8 楼 VisualEleven 的回复:
多个线程操作同一个对象吗?
每40ms一次数据,来一次数据就开启线程解算然后放到vector对象中(解算时间在20ms内)。用了个全局事件对象,好像跟之前没啥变化

#10


引用 7 楼 fengqinqdca 的回复:
结果都表明了一切。
你需要加锁处理.
那怎么加合适呢?我这是对话框应用程序,定义的vector在dlg类中,要给他加锁,具体怎么做呢?谢谢

#11


引用 10 楼 la9881275 的回复:
Quote: 引用 7 楼 fengqinqdca 的回复:

结果都表明了一切。
你需要加锁处理.
那怎么加合适呢?我这是对话框应用程序,定义的vector在dlg类中,要给他加锁,具体怎么做呢?谢谢


可以使用临界区,在使用vector的成员函数时加一下锁

#12


引用 11 楼 paschen 的回复:
Quote: 引用 10 楼 la9881275 的回复:

Quote: 引用 7 楼 fengqinqdca 的回复:

结果都表明了一切。
你需要加锁处理.
那怎么加合适呢?我这是对话框应用程序,定义的vector在dlg类中,要给他加锁,具体怎么做呢?谢谢


可以使用临界区,在使用vector的成员函数时加一下锁
我试过了。用的互斥事件,还是那样的结果。前面都是正常的。就是vector数据最后是不对的结果。在开启的数据解算线程里,判断是否到达目标位置,到达时发送指令给仪器停止测量。我估计是这里出了问题,数据前面的部分都是对的。

#13


多线程用stl一定要加锁