Openmp et double liste error
Bonjour,
j'ai un soucis sur un algo en c++ qui utilise de l'openmp.
Mon code fonctionne lorsque je travail sur un seul thread, mais lorsque je passe sur plusieurs thread l’obtient l'erreur suivante :
Code:
1 2
| *** glibc detected ***~/tpImage/MstWorker.obj: double free or corruption (fasttop): 0x41600540 ***
Object creation failure |
Et voici le code incriminé :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| void MstWorker::segment()
{
// Fill the image.
readPGM();
bool isInTree[m_imgSize]; // The cell is true if it is already in the mst.
std::fill_n(isInTree, m_imgSize, 0);
int sizeOfPart = 256 / m_segPart;
printf("segPart: %d sizeOfPart : %d \n", m_segPart, sizeOfPart );
// TV scan.
#pragma omp parallel for shared(isInTree) num_threads(4)
for (int i = 0; i < m_imgSize; i++)
{
if(isInTree[i])
continue;
int newColor = getNewColor(i, sizeOfPart);
m_image[i] = newColor;
// Create the new vector containing all point in this graph.
std::vector<int> newVector;
// The new point is on the tree now.
isInTree[i] = true;
// TODO ajouter l'offset du sous-segments eventuellement (voir lors du merging)
newVector.push_back(i);
addNewNode(i, newVector, isInTree, newColor, sizeOfPart);
int j;
// Membre de la classe
m_vecGraph.push_back(std::make_pair<int, std::vector<int> >(newColor, newVector));
}
writeFilePGM();
} |
A savoir que l'erreur vient du m_vecGraph.push_back, si je commente la ligne l'erreur disparait.
Voici le typedef du m_vecGraph
Code:
1 2
| typedef std::pair<int, std::vector<int> > graphColor_t;
typedef std::vector<graphColor_t> vecOfGraph_t; |
Comme en openmp, si je me trompe, les variables de classes sont automatiquement shared, je comprend pas d'ou vient l'erreur quelqu'un aurait-il une idée ?
Merci de votre aide