에 pthreading를 사용합니다. 이 기술은 다음과 같이 작동합니다. 아래 그림과 같이 원 안에 사각형이 새겨 져 있다고 가정합니다. 이 원의 반경을 1이라고 가정합니다. 먼저 간단한 (x, y) 좌표로 일련의 무작위 점을 생성합니다. 이 점들은 사각형을 묶는 데카르트 좌표 내에 있어야합니다. 생성 된 임의의 점의 총 개수 중 일부는 원 안에 발생합니다. π = 4 × (동그라미 점의 수)/(점의 총 개수)는 어떻게 멀티 스레딩을 사용하여 해결하기 위해이 질문을 받았다 C
의 멀티 스레 디드 버전 쓰기 다음 계산을 수행하여
다음 추정 π (파이) 이 알고리즘은 pthread를 사용하여 여러 개의 임의의 점을 생성하기 위해 하나 이상의 개별 스레드를 만듭니다. 스레드는 원 안에있는 점의 수를 계산하여 해당 결과를 전역 변수에 저장합니다. 이 스레드가 종료되면 상위 스레드가 π (pi)의 예상 값을 계산하여 출력합니다. 생성 된 무작위 점수의 수를 실험 해 볼 가치가 있습니다. 일반적으로 점의 수가 클수록 근사를 π (pi)에 더 가깝게 만듭니다.
나는 이것에 가까워지고 있다고 느끼지만 도움이 필요하다. 이 명확하게 난 단지 (나는 당신의 학습 경험을 빼앗아 싶지 않아) 의사 코드를 제공 할 숙제이기 때문에
#include <stdlib.h> // For random(), RAND_MAX
#include <stdio.h>
#include <math.h>
#include <pthread.h>
#define total 1200
int checkvalue(int r, float x, float y)
{
float dis,d;
int count = 0;
//Considering center as (0,0) as per the picture
dis = x*x + y*y;
d = r*r;
if(dis == d)
{
printf("\nPoint is on the circle\n");
return 1;
}
else
{
if(dis>d)
{
printf("Point is outside the circle\n");
return 0;
}
else
{
printf("Point is inside the circle\n");
return 1;
}
}
return 0;
}
void* CalPi(void* data)
{
int me = *((int*)data);
int max = 1, min = -1,r,p,count = 0;
float x[total], y[total],pi;
//Radius given is 1
r = 1;
/* thread identifying number */ // put the entire logic over here to get the co-ordinates (randomly) and checking them based on the conditions we
for(int i = 0; i< total; i++)
{
x[i] = (2 * ((float)rand()/RAND_MAX) - 1) ;
}
for(int i = 0; i< total; i++)
{
y[i] = (2 * ((float)rand()/RAND_MAX) - 1) ;
}
printf("Point are :");
for(int i = 0; i< total; i++)
{
printf("(%f,%f)\n", x[i],y[i]);
}
for(int i = 0; i< total; i++)
{
p = checkvalue(r,x[i],y[i]);
if (p == 1)
{
printf("Point : (%f,%f)\n",x[i],y[i]);
count = count + 1;
}
}
printf("count = %d", count);
pi = (float) 4 * (count/(total * 1.0));
printf("\nThe value of pi : %f ", pi);
}
void main()
{
int thread_id; pthread_t thread_val; //thread's structure
int t1 = 1; // thread 1 identifying number
int t2 = 2; //Creating a new thread which will execute 'CalPi()'
thread_id = pthread_create(&thread_val, NULL, CalPi, (void*)&t1); // executing 'CalPi()' in the main thread as well
CalPi((void*)&t2);
}
2 개의 스레드로 pi를 두 번 계산할 생각은 없지만 더 많은 데이터 요소를 추가하여 스레드의 pi 추정값을보다 정확하게 계산할 수 있습니다. 이를 위해 스레드는 공유 자원에 액세스해야합니다. 안전하게 할 수 있으려면 뮤텍스가 필요합니다. 나는 그것이 무엇인지에 관해 읽기 위해 운동가에게 운동으로 남겨 둡니다. – UKMonkey
받은 과제를 복사하면 코드가 도움이되지 않습니다. 문제가있는 곳을 분석하고 문제를 자세히 분석하는 것이 좋습니다. –
@UKMonkey 여러 번 계산 (스레드 당 1 개) 한 다음 평균을 취하는 일반적인 방법입니다. 이것은 또한 결과의 정확도에 대한 추정치를 직접 제공합니다. – MisterMiyagi