2016-10-12 1 views
0

에 pthreading를 사용합니다. 이 기술은 다음과 같이 작동합니다. 아래 그림과 같이 원 안에 사각형이 새겨 져 있다고 가정합니다. 이 원의 반경을 1이라고 가정합니다. 먼저 간단한 (x, y) 좌표로 일련의 무작위 점을 생성합니다. 이 점들은 사각형을 묶는 데카르트 좌표 내에 있어야합니다. 생성 된 임의의 점의 총 개수 중 일부는 원 안에 발생합니다. π = 4 × (동그라미 점의 수)/(점의 총 개수)는 어떻게 멀티 스레딩을 사용하여 해결하기 위해이 질문을 받았다 C

의 멀티 스레 디드 버전 쓰기 다음 계산을 수행하여

visual of circle

다음 추정 π (파이) 이 알고리즘은 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); 

    } 
+1

2 개의 스레드로 pi를 두 번 계산할 생각은 없지만 더 많은 데이터 요소를 추가하여 스레드의 pi 추정값을보다 정확하게 계산할 수 있습니다. 이를 위해 스레드는 공유 자원에 액세스해야합니다. 안전하게 할 수 있으려면 뮤텍스가 필요합니다. 나는 그것이 무엇인지에 관해 읽기 위해 운동가에게 운동으로 남겨 둡니다. – UKMonkey

+3

받은 과제를 복사하면 코드가 도움이되지 않습니다. 문제가있는 곳을 분석하고 문제를 자세히 분석하는 것이 좋습니다. –

+0

@UKMonkey 여러 번 계산 (스레드 당 1 개) 한 다음 평균을 취하는 일반적인 방법입니다. 이것은 또한 결과의 정확도에 대한 추정치를 직접 제공합니다. – MisterMiyagi

답변

1

: 여기 내 코드입니다.

전역 변수 : 다음은 훈련을 해결할 수있는 방법에 대한 몇 가지 포인터

long total - 스레드 당 반복 횟수는 (또한 #define 될 수 있습니다).

long K - 가장 큰 스레드 식별자보다 커야합니다.

long count[K] - 스레드 카운터. 각 스레드는 원 안에있는 임의의 점의 수로 카운터를 업데이트합니다.

홈페이지 :

  1. total의 값을 (글로벌 휘발성 변수가 될 수있다)를 설정합니다.

    1. 루프 total 회 루프 반복을 위해
    2. , 임의의 생성 : 스레드
    3. 만들 스레드
    4. 기다립니다
    5. 합계는
    6. 인쇄, 총을

    스레드 결과 결과를 추가하고 checkvalue의 결과를 추가하십시오. 스레드에 대한 카운트.

참고

각 스레드 (인덱스로서 스레드 식별자 번호를 사용하여 글로벌 배열의 예) 별도 카운트 변수를 가져야한다. 각 점에 대한 결과를 저장할 필요는 없습니다. 동일한 카운트 변수를 사용하면 해당 변수에 대한 액세스가 동기화되어야하며 이는 성능을 저하시킵니다.

주 2 :

전역 변수의 사용은 정말 스레드와의 통신을 처리하는 가장 좋은 방법이 아닙니다. 그러나 가장 쉬운 방법이기 때문에 시작 스레드 프로그래머에게는 충분합니다.

관련 문제