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 : 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
Et voici le code incriminé :

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();
}
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 : 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;
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