Witam,
mam takie pytanie bo napisalem program na watkach ktory liczy ilosc liczb pierwszych w okreslonym przedziale, ale mam problem bo potrzebuje do tego jeszcze sekcje lokalna i krytyczna lub moze byc na mutexach zrobionych. czy ktos potrafi mi pomoc??

ponizej przedstawiam kod programu


// Kompilacja: cc p.c -o p -lpthread

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include "MyTools.h"
#define NUM_THREADS 400
pthread_t tid[NUM_THREADS]; // Tablica identyfik.watkow
int pocz[NUM_THREADS];
int kon[NUM_THREADS];
int wynik[NUM_THREADS];
int stop=0, delta,zakres, d1=0,d2=0;

void *znajdz(void *arg);

int main(int argc, char *argv[])
{

int i,ilosc_watkow, sum = 0;
  zakres = atoi(argv[1]);
  printf("Podaj ilosc watkow:\n");
  scanf("%d", &ilosc_watkow);
  printf("Podaj delte:\n");
  scanf("%d", &delta);
  d1=d1-delta;
  InitProcesTime();
  float czas;  
  czas=GetTime();

  for (i = 0; i < ilosc_watkow; i++) 
  {
     pthread_create(&tid[i], NULL, znajdz,(void *)i);
  }

  // Czekanie na zakonczenie ------
  for (i = 0; i < ilosc_watkow; i++)
        pthread_join(tid[i], NULL);
  for (i = 0; i < NUM_THREADS; i++)
       	sum = sum + wynik[i];
	//podsumowanie
	czas+=GetTime()-czas;
	printf("\n\nPODSUMOWANIE:\n");
	printf(" -zakres: %d\n -ilosc watkow: %d\n -delta: %d\n -wynik:%d\n -czas:%4.1fs\n",zakres,ilosc_watkow, delta, sum,czas);
  return 0;
}

//przeszukuje zakres liczb
void *znajdz(void *arg) 
{
  int j,x1,x2, lpierw;
  int num = (int)arg;
  
  while (stop==0)
  {
  d1=d1+delta;
  d2=d1+delta-1;
   	if (zakres<d2)
  	{
	stop=1;
	}
	
	if (zakres>d2)
 	{  
	lpierw = 0;
  	x1 = d1;
  	x2 = d2;
  	printf("Watek nr %d -> zakres: %d - %d \n",num,x1,x2);
  	  for(j=x1;j<=x2;j++) 
	  {
      	  if(isPrime(j)) lpierw++;
  	  }
  	printf("Wynik watku: %d -> liczb pierwszych: %d \n",num,lpierw);
  	wynik[num] = wynik[num]+lpierw;
	}
	}
  return(NULL);
}

//sprawdza czy liczba jest pierwsza
int isPrime(int n) {
    int i;
    for(i=2; i*i <= n; i++) {
        if((n%i) == 0) return 0;
    }
    return 1;
}

i do tego plik MyTools.h


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/times.h>
#include <signal.h>
#include <sched.h>
#include <pthread.h>


//========= Procedura pomocnicza do pomiaru czasu 
int ProcesTime = 0;
void SignalALARM(int sig) { ProcesTime++; }
//==================================================


// Funkcja uruchamia zegar do pomiaru czasu trwania procesu
void InitProcesTime()
{ struct sigaction action;
  struct itimerval time_val;

  action.sa_handler = (void (*)(int)) SignalALARM;
  action.sa_flags = 0;
  sigemptyset(&action.sa_mask);  
  sigaction(SIGALRM, &action, NULL);
  time_val.it_interval.tv_sec = 0;
  time_val.it_interval.tv_usec = 100000;
  time_val.it_value.tv_sec = 0;
  time_val.it_value.tv_usec = 100000;
  setitimer(ITIMER_REAL, &time_val, NULL);
  ProcesTime = 0;
}

// Funkcja zwraca czas trwania procesu z dokladnoscia do 0.1 sekundy
float GetTime()
{ return 0.1 * ProcesTime;
}

// Funkcja wstrzymuje wykonywanie procesu (czas podawany w milisekundach
void Delay(unsigned int time)
{ struct timeval tv;
//  poprawka z dnia 5 listopad 2006 r.
  tv.tv_sec = time/1000;
  tv.tv_usec = (time%1000) * 1000;
  while ( select(0, NULL, NULL, NULL, &tv) );
}


// funkcja inicjuje generator liczb losowych
void Randomize()
{ srand(time(NULL) + getpid());
}


// Funkcja zwraca liczbe losowa z przedzialu [0 , n-1]
int IntRand(int n)
{ return (int) (1.0*n*rand()/(RAND_MAX+1.0));
}


// Funkcja zwraca liczbę losow± z przedziału [min, max]
int MinMaxRand(int min, int max)
{ return min + IntRand(max-min+1);
}

z gory dzieki za wszelka pomoc