【问题标题】:Vector [] operation (read only) thread safetyVector[]操作(只读)线程安全
【发布时间】:2020-11-30 10:51:02
【问题描述】:

作为对象初始化的一部分,我创建了一个向量并填充了数据。初始化后向量不会被修改。向量的声明是

std::vector<AnalyticalChuckRing_t> m_analyticalRings;

我们将从多个异步任务中调用一个名为 GroupCirclesByRing 的方法。以下代码行在此方法中访问向量对象。我几乎可以肯定这些语句不需要保护,因为它不会修改对象。我在哪里可以找到确保不需要线程同步的文档?

 auto GetRingAndAngle = [=](const CPoint& point)
            {
                double dDistance = DistanceFromOrigin(point);
                double dAngle{ 0.0 };
                for (int nRing = 1; nRing <= TotalRings; ++nRing)
                {
                    if (abs(dDistance - m_analyticalRings[nRing].dRadius) < 3 )
                    {
                        dAngle = atan2((resultRings[0][0].center.m_dY - point.m_dY), (point.m_dX - resultRings[0][0].center.m_dX));
                        // Convert angle to range [0 : 2 PI]
                        dAngle = (dAngle < 0) ? (2 * M_PI + dAngle) : dAngle;
                        return make_tuple(nRing, dAngle);
                    }
                }
                return make_tuple(InvalidRingNo, dAngle);
            };

【问题讨论】:

  • 我怀疑你能找到明确说明你的代码没问题的东西。您可以找到不合适的规则,它们不适用,因为没有写任何东西
  • 我的问题是我是否必须使用互斥锁来保护 GroupCirclesByRing 方法
  • 我了解您的问题。您需要一个互斥锁来防止竞争条件。你读过上面的链接吗?
  • 顺便说一句,细节很重要。可以将代码添加到您的 2 行中,使它们执行完全不同的操作并实际修改向量。如果您想确保得到正确答案,请附上minimal reproducible example

标签: c++ visual-c++ stl


【解决方案1】:

我在哪里可以找到确保不需要线程同步的文档?

那将是 C++ 标准。草稿可通过https://github.com/cplusplus/draft公开获取

看看像 [intro.races] 这样的部分。

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 2012-03-07
    • 2012-02-20
    • 2019-07-08
    • 2010-12-03
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多