如果只有一个线程修改 std::vector,那么同一个线程在从向量读取时是否需要使用锁?

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 才会发生数据竞争。如果所有线程都只是简单地读取线程安全。

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

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

但是,读写线程知道只读线程是只读的,因此当它在读时,另一个线程只能读或不读。这意味着在这种情况下不可能发生数据争用,也不必使用锁。

读写线程在修改vector时仍需使用锁

对吗?

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