2011-09-15 5 views
4

파일에서 15,000 개의 정수를 입력하는 프로그램을 작성 중입니다. 값을 읽은 후에 스레드는 각 스레드가 해당 블록의 합계를 계산할 책임이있는 10 개의 스레드를 생성해야합니다 (각각 1,500 개의 값). 그러면 각 스레드는 해당 값의 합계를 인쇄하고 주 스레드는 모든 10 개 스레드의 합계를 계산합니다.멀티 스레딩을 사용하여 합계 계산

내가 가지고있는 것은 모든 값을 읽고 int 배열을 사용하여 int 값을 읽는 (int 값이라고 부름) 횟수를 유지하는 것이다. 이 숫자를 각 스레드가 가져야하는 블록 당 값의 수를 결정하고자하는 스레드의 수로 나눕니다 (int 블록이라고 부름). 그런 다음 배열 색인 수를 증가시키면서 배열 (int 블록 시간)을 통해 스레드, 루프를 시작한 다음 배열 색인 수가 마지막 배열 색인과 같지 않은 한 새 스레드를 시작합니다.

이 문제를 해결하는 올바른 방법입니까? 더 간단한 접근법이 있습니까? 우리는 pthread_create, pthread_join, pthread_exit, pthread_attr_init, pthread_attr_destroy 및 pthread_setdetachstate를 활용하기위한 힌트를 제공 받았습니다. 이것이 멀티 스레딩에 대한 나의 첫 번째 시도이기 때문에, 실제로는 멀티 쓰레딩이며 개별 스레드를 여러 번 수행하지 않도록 각 코드를 어디에서 시작하고 종료해야하는지에 대한 피드백을 얻는 것이 좋습니다. 어떤 도움이라도 대단히 감사하겠습니다!

편집 : 명령 행에 붙어 인수

#include <stdio.h> 

int main(int argc, char *argv[]) { 
int i; 
FILE *fp; 
int c; 

for (i = 1; i < argc; i++) { 
    fp = fopen(argv[i], "r"); 

    if (fp == NULL) { 
     fprint(stderr, "cat: can't open %s\n", argv[i]); 
     continue; 
    } 

    while ((c = getc(fp)) != EOF) { 
     putchar(c); 
    } 

    fclose(fp); 
} 

return 0; 
} 

나는 우리가이 부분을 적용 할 때 내가 I/O에서 얼마나 끔찍한 잊어 버린 것 같다. 주어진 매개 변수로 내 프로그램 (prob_5.c)을 테스트하는 명령 줄 인수는 무엇입니까?

답변

5

계획이 좋은 것 같습니다. 내가 너라면, 나는 그것을 실행하고 어떤 문제가 생길 때마다 구체적인 문제로 되돌아 가려고 노력할 것이다.

내 코드에서 나는 가 시작해야하는 위치에 대한 피드백을 얻을 중대하고 각 스레드

주 스레드가 근로자를 만드는 것을 끝낼 것입니다. 이것은 당신이 자세히 설명하는 루프의 일부분이 될 것입니다. 어쨌든 작업자는 스레드 기능에서 복귀하여 종료됩니다.

기대하지 않아야 할 것은 속도 향상입니다. 모든 열 명의 작업자 버전이 단일 스레드 동급 제품보다 느릴 수 있습니다. 이것은 작은 크기의 입력 배열과 스레드 생성 및 후속 동기화의 오버 헤드와 관련이 있습니다. 게다가 @Adam Rosenfield가 주석에서 옳게 지적한 바와 같이, 전반적인 프로그램은 어쨌든 I/O 경계 일 가능성이 높습니다.

+2

하지 않음이 문제는 I/O가 바인딩 될 것이라고 언급 다음 15,0 읽기 00 파일의 정수는 단일 스레드인지 또는 다중 스레드인지에 관계없이 합계보다 더 오랜 시간이 걸립니다. –

+0

마지막 단락의 경우 +1입니다. 현실 세계에서 스레드를 만드는 데는 15000 개의 정수를 합치는 것과 거의 같은 시간이 걸립니다. 그리고 정수를 읽고 십진수 표현을 쓰레드로 변환하는 작업을 분리하면 상당한 속도 향상을 얻을 수 있습니다. –

+0

정수를 읽는 작업을 분할하려고 시도 할 수 있습니다. 독서를 분리해도 정수를 10 진수 형식으로 두거나 속도를 높이면 속도가 향상됩니까? – raphnguyen

0

어떤 것들은 생각하는 약 :

1) 어떻게 메인 쓰레드는 합산 작업이 모두 동시에 실행되는 스레드에서 사용할 수 완전하고 데이터 있음을 알 수 있습니까? 당신을 포함한 일부 디자인에서는 시작한 마지막 스레드가 마지막으로 끝나지 않을 수도 있습니다.

2) 속도 향상이있을 때 어떻게 시간을 보냅니 까? 15000 개의 정수가있는 스톱워치는 아무 쓸모가 없습니다!

3)이 합산 작업이 더 큰 응용 프로그램의 일부로 사용되며 두 번 이상 실행되거나 (여러 입력 파일에서 동시에 실행되는 경우) 10 개의 스레드를 만들면 시작 및 생성자 대기열에서 요청을 합산하기 위해 대기 (스레드 풀 생성)하면 연속 스레드 생성/종료를 제거하여 전체 성능을 향상시킬 수 있습니다.

4) 이미 여기에서 언급했듯이 15000 개의 정수는 너무 많은 데이터가 아니므로 합계는 빠른 연산이므로 경고를주의하십시오 느린 디스크 입출력 등에 관한 다른 포스터에서.

5) 숙제 응용 프로그램을 만들 때 SSD로 수행하는 방법을 보는 것이 재미있을 수도 있습니다. 어쩌면 교사/교수가 당신을 사귈 수 있습니다. 하나

RGDS, 마틴

+0

고마워요! 나는 운동을하면서이 점을 명심해야한다. 아마 내 강사/교수님이 내게 SSD를 사 주실 수 있습니까? 네가 간 대학에 가보고 싶다. – raphnguyen

+0

교수에게 보내는주의 사항 : 가능한 경우이 사람/여성이 숙제 응용 프로그램을 실행하고 출력 할 수 있으면 비교 측정을 위해 SSD 및 여러 코어가있는 상자에 액세스 할 수 있습니다. [Martin James, over 30 년 동안 다중 스레드 응용 프로그램 개발]. –

+0

내 교수님이 이걸보기를 바랍니다. 그리고 여기에 멀티 스레딩 지식을 가져올 수 있기를 바랍니다. http://stackoverflow.com/questions/7438697/multithreading-when-to-start-and-exit-threads – raphnguyen

관련 문제