【问题标题】:If only one thread modifies an std::vector, does that same thread need to use a lock when it reads from the vector?如果只有一个线程修改了 std::vector,那么同一个线程在从向量读取时是否需要使用锁?
【发布时间】:2021-10-04 04:15:03
【问题描述】:

据我了解,只有当一个或多个线程正在修改向量时,std::vector 才会发生数据竞争。如果所有线程都在读取,那是线程安全的。

现在假设我有 2 个线程。一个只能从向量中读取,而另一个读取并修改向量的大小。我有一个锁来保持对向量的线程安全。

当只读线程从向量中读取时,它必须使用锁,因为它不知道其他线程同时在做什么。

但是,读写线程知道只读线程是只读的,因此当它正在读取时,其他线程只能读取或不读取。这意味着在这种情况下不可能发生数据争用,并且它不必使用锁。

读写线程在修改vector的时候还是要使用锁的。

是吗?

【问题讨论】:

    标签: c++ multithreading vector thread-safety


    【解决方案1】:

    你是对的。如果您的单个写入线程处于读取模式,则不需要发生锁定,因为另一个线程只是读取器。读者不能相互冲突。只读线程在每次读取时仍然需要获取锁,写入线程在写入时需要锁定,但读取不需要锁定。

    【讨论】:

    • 您所说的绝对正确,但听起来并不是什么好建议——至少从与团队合作过大型项目的软件开发人员的角度来看,这不是。原因如下:有人编写了一个读取向量的新方法。它不会锁定锁,因为它只从“writer”线程调用。然后过了一段时间,一个编写将由其他线程执行的代码的开发人员发现它并说:“嘿!这个方法正是我想要的......”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多