I have problems parallelizing this code, I think I have to use the critical clause but I don't know how...
#include <stdio.h>
#include <sys/time.h>
#define N4 5000
#define N5 5000
#define PIXMAX 10
#define NUM_THREADS 4
int i, j, k;
int histo[PIXMAX], image[N4][N5];
void calculate_histo(int *array, int matrix[N4][N5]) {
for(i=0; i<PIXMAX; i++) array[i] = 0;
    #pragma omp parallel
    {
        int array_private[PIXMAX];
        for(i=0; i<PIXMAX; i++) array_private[i] = 0;
        #pragma omp for
        for(i=0; i<N4; i++)
            for(j=0; j<N5; j++) {
                array_private[matrix[i][j]]++;
                                }
        #pragma omp critical
        {
            for(i=0; i<PIXMAX; i++) {
                array[i] += array_private[i];
            }
        }
    }
}
main ()
{
omp_set_num_threads(NUM_THREADS);
for(i=0; i<N4; i++)
   for(j=0; j<N5; j++)
   {
     if(i%3) image[i][j] = (i+j) % PIXMAX;
     else    image[i][j] = (i+i*j) % PIXMAX;
   }
calculate_histo(histo,image);
for (k=0; k<PIXMAX; k++) printf("%9d", histo[k]);
}
I get different results each time I run it, the outputs in 5 executions:
1.- 3424378  1765911  2356499  1767451  2354765  2123619  2355686  1767270  2355937  1762464
2.- 3359050  1728213  2310171  1727858  2309947  2094584  2309402  1727705  2310021  1726228
3.- 3479377  1782549  2373773  1783920  2372319  2153420  2374614  1785481  2375290  1781468
4.- 3459613  1781119  2362956  1783067  2362662  2154083  2360726  1781994  2362982  1779394
5.- 3434711  1751408  2349619  1750327  2348681  2104916  2348510  1750427  2350599  1747760
Problems solved, all working fine, thanks for the help! the final code I use is this:
See the comments for more information, like not using global variables or using matrix[i* 5000 + j] instead of matrix[i][j]
#include<stdio.h>
#include<sys/time.h>
#include<omp.h>
#define N4 5000
#define N5 5000
#define PIXMAX 10
#define NUM_THREADS 4
int histo[PIXMAX], image[N4][N5];
int i,j,k;
void calculate_histo(int *array, int matrix[N4][N5]) {
for(i=0; i<PIXMAX; i++) array[i] = 0;
#pragma omp parallel private(i,j)
  {
    int array_private[PIXMAX];
    for(i=0; i<PIXMAX; i++)
      array_private[i] = 0;
#pragma omp for
    for(i=0; i<N4; i++)
      for( j=0; j<N5; j++) {
    array_private[matrix[i][j]]++;
      }
#pragma omp critical
    {
      for( i=0; i<PIXMAX; i++) {
    array[i] += array_private[i];
      }
    }
  }
}
int main () {
  omp_set_num_threads(NUM_THREADS);
  for( i=0; i<N4; i++)
    for( j=0; j<N5; j++) {
      if(i%3) 
        image[i][j] = (i+j) % PIXMAX;
      else
        image[i][j] = (i+i*j) % PIXMAX;
    }
  for ( k=0; k<PIXMAX; k++) 
    printf("%9d", histo[k]);
  printf("\n");
  calculate_histo(histo,image);
  for ( k=0; k<PIXMAX; k++) 
    printf("%9d", histo[k]);
  printf("\n");
  return 0;
}