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 :
Et voici le code incriminé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 *** glibc detected ***~/tpImage/MstWorker.obj: double free or corruption (fasttop): 0x41600540 *** Object creation failure
A savoir que l'erreur vient du m_vecGraph.push_back, si je commente la ligne l'erreur disparait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
Voici le typedef du m_vecGraph
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 typedef std::pair<int, std::vector<int> > graphColor_t; typedef std::vector<graphColor_t> vecOfGraph_t;
Merci de votre aide
Partager