2014-08-30 61 views
0

当多线程使用时,Qt容器是安全的只读模式。但是写访问呢?我可以调整QVector的大小并在不同的线程中使用operator[]进行书写吗? QVector的大小将保持不变,每个线程将写入不同的内存位置(每个线程都有自己的索引),因此不会有同样的内存同时访问。 QVector将是一个全局变量。QVector预分配访问线程安全

+0

如果每个线程写入矢量的单独部分,则不需要在单个矢量中包含所有这些数据。有一个每个线程向量。 – 2014-08-30 20:12:27

+0

@KubaOber其实我是这样做的,我需要确保向量的顺序与我有一个单线程应用程序的顺序相同。如果我在线程完成后尝试加入向量将会更困难。 – Nazar554 2014-08-31 06:56:03

回答

1

Qt文档定义QVector的成员函数为reentrant,这意味着如果每个线程都有不同的QVector实例,则从线程调用它的方法是安全的。这意味着QVector不会像您打算使用它的方式那样线程安全。

如果您可以保证您的QVector写入不会改变其长度并且不会重叠,您可能会发现不会有问题。但是如果你知道你将要写入矢量的不同区域,为什么不将矢量分成子矢量并且在每个子矢量上使用一个线程?这将使您能够保证您不会遇到线程相关的问题。当您的工作完成后,您可以将矢量替换为单个实体。