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