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)
要在没有锁的情况下使用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 中,因为它们不可复制构造。为此,您需要一个包装器,如本答案中所述。