Vector of mutex 同步访问向量单元
Vector of mutex to synchronize access to vector cells
我编写代码对向量进行一些并行操作,我的目标是保护向量的单个单元格以便可以并行访问其他单元格,所以我尝试使用相同大小的互斥向量另一个向量
vector<int> myIntVec(n,0);
vector<mutex> mtxVec(n);
然后是临界区,每个线程都执行这个(目标是标记可见的单元格)
for (i of something)
{
mtxVec[i].lock();
if (myIntVec[i] == 0 ){
myIntVec[i]++;
mtxVec[i].unlock();
}
else
mtxVec[i].unlock();
}
没有对这 2 个向量进行其他操作。
但是做了一些测试,我得到的是 myIntVec 单元格包含大于 1 的数字,而它们应该至少包含 1。
我错过了什么?
为了大家分享这个linkhttps://codecollab.io/@proj/InternetDivisionTrucks# in comments. Seems that you try to protect vector<bool> visited(nn);
by mutexes vector<mutex> vis_lock(nn);
. As i know there is special implementation for std::vector<bool>
in which bool
s stored packed https://en.cppreference.com/w/cpp/container/vector_bool。因此,当它访问第 i
个元素时,附近的元素也将被触及,并且由于同时访问一个字节的内存而并发地爆炸。尝试将 std::vector<bool>
替换为 std::vector<char>
或 std::vector<int>
我编写代码对向量进行一些并行操作,我的目标是保护向量的单个单元格以便可以并行访问其他单元格,所以我尝试使用相同大小的互斥向量另一个向量
vector<int> myIntVec(n,0);
vector<mutex> mtxVec(n);
然后是临界区,每个线程都执行这个(目标是标记可见的单元格)
for (i of something)
{
mtxVec[i].lock();
if (myIntVec[i] == 0 ){
myIntVec[i]++;
mtxVec[i].unlock();
}
else
mtxVec[i].unlock();
}
没有对这 2 个向量进行其他操作。 但是做了一些测试,我得到的是 myIntVec 单元格包含大于 1 的数字,而它们应该至少包含 1。 我错过了什么?
为了大家分享这个linkhttps://codecollab.io/@proj/InternetDivisionTrucks# in comments. Seems that you try to protect vector<bool> visited(nn);
by mutexes vector<mutex> vis_lock(nn);
. As i know there is special implementation for std::vector<bool>
in which bool
s stored packed https://en.cppreference.com/w/cpp/container/vector_bool。因此,当它访问第 i
个元素时,附近的元素也将被触及,并且由于同时访问一个字节的内存而并发地爆炸。尝试将 std::vector<bool>
替换为 std::vector<char>
或 std::vector<int>