如果我确定每个线程总是将相同的值写入共享内存,我应该使用锁吗?

spo*_*a__ 3 c++ multithreading operating-system vector

C++ :我有一个vector<bool>,没有线程会向任何索引写入 false 。我还应该使用锁吗?我认为它不会导致竞争条件,因为所有线程都在写入相同的 value 。多个线程访问的函数如下所示:

void setVal(int index) 
{
  if (boolvec[index] == false)
    boolvec[index] = true; 
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*our 5

要在没有锁的情况下使用std::vector<atomic_flag_wrapper>,您应该使用与此答案中的代码类似的whereatomic_flag_wrapper包装。std::atomic_flag

随着std::vector<bool>您必须使用锁,标准中明确告诉你了:

尽管有 [res.on.data.races],当同时修改同一容器中不同元素中包含的对象的内容时,实现需要避免数据竞争,除了vector<bool>

http://eel.is/c++draft/container.requirements.dataraces#2(C++草案,02.08.2020),强调我的

用简单的英语:

std::vector<bool>没有需要确保写入到两个不同的元素是无竞争; 因此可能存在数据竞争;所以你需要一把锁。

如果它是例如std::vector<char>,则标准可以确保charVector[0]charVector[1] 可以同时写入。但是仍然不能同时charVector[0]从多个线程写入;你需要使用 atomic

std:atomic<bool>不保证是无锁的,所以你应该使用std::atomic_flag有这个保证的。std::vector但是,您不能将它们放入 a 中,因为它们不可复制构造。为此,您需要一个包装器,如本答案中所述