gpt4 book ai didi

c++ - 通过检查条件并重新检查来获取锁

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:36 25 4
gpt4 key购买 nike

这样的东西是否有效:

std::vector<std::vector<int>> data;
std::shared_mutex m;
...

void Resize() {
// AreAllVectorsEmpty: std::all_of(data.begin(), data.end(), [](auto& v) { return v.empty(); }
if (!AreAllVectorsEmpty()) {
m.lock();
if (!AreAllVectorsEmpty()) {
data.resize(new_size);
}
m.unlock();
}
}

我正在检查 AreAllVectosEmpty(),然后如果条件成功,则获取锁定,然后再次检查相同的条件是否执行调整大小。

这会是线程安全的吗? Resize 仅被一个线程调用,但其他线程操作 data 的元素。

是否要求 AreAllVectorsEmpty 具有内存栅栏或获取语义?

编辑:当 resize 获取 m.lock 时,其他线程当然会阻塞。

编辑:我们还假设 new_size 足够大以发生重新分配。

编辑:更新 shared_mutex 的代码。

编辑:AreAllVectorsEmtpy 正在迭代数据 vector 。没有其他人修改数据 vector ,但 data[0]、data[1] 等被其他线程修改。我的假设是因为 data[0] 的大小变量在 vector 内部并且是一个简单的整数,所以访问 data[0].size()、data[1].size() 等是安全的... 调整大小 线程。 AreAllVectorsEmpty 正在遍历 data 并检查 vector.empty()

最佳答案

我会使用 shared_mutex 并使用:

  • 所有读取 vector 的线程中的共享锁(在读取 vector 时)
  • 调整 vector 大小时在该线程中的唯一锁

我认为首先检查大小,然后调整大小是安全的,前提是这是修改 vector 内容的唯一线程。

锁自动意味着内存屏障,否则锁就没有多大意义。

关于c++ - 通过检查条件并重新检查来获取锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50577784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com