我撰寫了代碼來對向量進行一些并行操作,我的目標是保護向量的單個單元格,以便可以并行訪問其他單元格,所以我嘗試使用與另一個向量相同大小的互斥體向量
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();
}
對這兩個向量沒有其他操作。但是做一些測驗,我得到的是 myIntVec 單元格包含大于 1 的數字,而它們應該至少包含 1。我錯過了什么?
uj5u.com熱心網友回復:
為了您在評論中分享此鏈接https://codecollab.io/@proj/InternetDivisionTrucks# 。似乎您試圖vector<bool> visited(nn);通過 mutexes進行保護vector<mutex> vis_lock(nn);。據我所知,有一個特殊的實作std::vector<bool>,其中bool存盤了打包的https://en.cppreference.com/w/cpp/container/vector_bool。因此,當它訪問i元素附近的第-個元素時,也會被觸及,并且由于同時訪問一個位元組的記憶體,它會爆炸。嘗試替換std::vector<bool>為std::vector<char>或std::vector<int>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425970.html
