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 bools stored packed https://en.cppreference.com/w/cpp/container/vector_bool。因此,当它访问第 i 个元素时,附近的元素也将被触及,并且由于同时访问一个字节的内存而并发地爆炸。尝试将 std::vector<bool> 替换为 std::vector<char>std::vector<int>