【发布时间】:2018-05-29 06:36:18
【问题描述】:
这样的事情是否有效:
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 是否要求有内存栅栏或获取语义?
编辑:当m.lock 被Resize 获取时,其他线程当然会阻塞。
编辑:我们还假设new_size 足够大,可以进行重新分配。
编辑:更新 shared_mutex 的代码。
编辑:AreAllVectorsEmtpy 正在迭代数据向量。没有其他人修改数据向量,但数据[0]、数据[1]等被其他线程修改。我的假设是因为 data[0] 的 size 变量在向量内并且是一个简单的整数,因此可以安全地访问 data[0].size()、data[1].size() 等... Resize 线程。 AreAllVectorsEmpty 正在迭代 data 并检查 vector.empty()。
【问题讨论】:
-
如果这个函数不修改共享资源,它是线程安全的
-
@mangusta 它正在修改
data向量。 -
m.resize?不是data.resize? -
@WernerHenze 已修复。谢谢。
-
不要调用
mutex.lock(),而是使用std::unique_lock
标签: c++ multithreading memory-barriers