【问题标题】:QVector preallocated access thread safetyQVector 预分配访问线程安全
【发布时间】:2014-08-30 11:12:39
【问题描述】:

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

【问题讨论】:

  • 如果每个线程都写入向量的单独部分,则您不需要将所有这些数据放在一个向量中。有一个每线程向量。
  • @KubaOber 实际上我这样做了,我需要确保向量的顺序与我有一个单线程应用程序一样。如果我在线程完成后尝试加入向量会更难。

标签: c++ qt thread-safety


【解决方案1】:

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

如果您可以保证您对 QVector 的写入不会改变其长度并且不会重叠,您可能会发现您不会遇到问题。但是,如果您知道要写入向量的不同区域,为什么不将向量拆分为子向量并使用线程处理每个子向量呢?这将允许您保证不会遇到与线程相关的问题。完成工作后,您可以将向量替换为单个实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多