2010-07-07 3 views
7

누군가가 C에서 간단한 스레딩 예제를 가지고 있습니까?C에서 리눅스 스레딩?

줄 단위로 txt 파일을 읽고 전체 txt를 처리하기 위해 스레드를 사용하는 작은 콘솔 응용 프로그램을 만들고 싶습니다. 어떻게해야합니까? txt를 X로 나눕니다. 여기서 X = N의 스레드가 내 마음에 제일 먼저 오는 것이고, 더 좋은 방법이 있습니까?

+1

분할하는 방법과 필요 여부는 디자인에 따라 다릅니다. 파일 처리의 의미는 무엇이며, 파일의 어떤 종류의 데이터입니까? 모든 경우에 대한 해결책은 없습니다. – pmod

+0

각 줄은 URL이고 "처리 중"은 URL을 방문하여 일부 텍스트를 구문 분석합니다. – jahmax

답변

7

pthreads를 검색하십시오. 나는 또한 스레드 초보자입니다. 다음은 1에서 1000000000까지의 코드 스 니펫입니다 (또한 첫 번째로 작동하는 pthread 프로그램).

#include <stdio.h> 
#include <pthread.h> 

struct arg { 
    int a, b; 
    int *rst; 
}; 
typedef struct arg arg; 

void* sum(void *); 

int main() 
{ 
    pthread_t sum1, sum2; 
    int s1, s2; 
    pthread_create(&sum1, NULL, sum, &(arg){1, 500000000, &s1}); 
    pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2}); 
    pthread_join(sum1, NULL); 
    pthread_join(sum2, NULL); 
    printf("%d\n", s1 + s2); 
} 

void* sum(void *ptr) 
{ 
    int i, temp = 0; 
    arg *x = ptr; 

    for(i = x->a; i <= x->b; ++i) 
     temp += i; 
    *(x->rst) = temp; 
} 
+1

'rst'는'volatile'으로 선언되어야합니다. 또한이 코드는 C99 표준에서만 유효하며 C89는 유효하지 않습니다. –

+0

필요 없음. 결코 수정되지 않았습니다. –

+2

'rst'는'volatile '수식 된 포인터 일 필요는 없지만 코드는 괜찮습니다. '* (x-> first) '에 저장하는 것은 컴파일러에 의해 생략 될 수 없다. 'pthread_join'은 장벽을 의미합니다. – caf

8

IMHO는 POSIX 스레드를 사용하는 것이 가장 좋습니다. 자세한 내용은 HERE을 참조하십시오.

James의 답변에있는 링크를 확인하십시오.

3

쉬운 방법을 원할 경우 OpenMP는 gcc가 지원하는 강력한 멀티 스레딩 라이브러리입니다.

#omp parallel for 
    for(i=0; i<1000; i++){ 
    a[i] = b[i] + c[i]; 
    } 

이 두 어레이의 간단한 첨가를 수행하며 "A"로 결과를 저장하지만, 쿼드 코어 머신 (하이퍼 스레딩을 지원하는 경우 8) 4 개 스레드가 그것을 처리하도록 스폰.

Linux에서의 간편한 멀티 코어 프로그래밍. :)

핀란드 인에 의한 안내 : http://bisqwit.iki.fi/story/howto/openmp/

1

분할 스레드 X = N, 내 마음에 을 오는 첫번째 것은이 X로 TXT, 더 나은 방법은 무엇입니까?

응용 프로그램에 따라 다릅니다.

    데이터를 해석하여, 성능 향상이 파일 I/파일을 읽는 것은 병목 경우
  • 스레드 실 거예요 도움이 O 속도, I/O가있는 디스크에 의해 제한됩니다 병목 경우
  • 글이 도움이 될 수 하드웨어에 의해 제한되며 더 많은 스레드가 데이터를 요청할 경우에만 저하됩니다.

정보를 해석하는 데 오랜 시간이 걸리는 경우 producer consumer pattern과 같은 것을 사용할 수 있으며 필요한 스레드의 수를 스스로 테스트 할 수 있습니다. (낮은 수로 시도하고 얼마나 많은 사람들이 당신에게 최고의 성능을 제공하는지보십시오). 일부 예제는 찾을 수 있습니다 herehere

다른 답변으로 스레드를 구현하는 데 pthreads를 사용할 수 있다고 지적했습니다.

+0

데이터 해석시 병목 현상이 있습니다. URL을 방문하여 한 번에 하나씩 수행해야하므로 속도가 느리고 절름발이입니다. 그 위키 링크는 매우 차가워서 감사합니다. C에서 생산자 - 소비자 "솔루션"에 대한 몇 가지 예가 있습니까? – jahmax

1

여기서 정말로 멀티 스레딩해야하는지 여부를 먼저 묻습니다. 스레드간에 공유 상태가 필요합니까 (예 : 모든 URL의 구문 분석 정보가 동일한 데이터 구조로 끝나나요? 그렇지 않으면 프로세스 (fork)로 충분할 수 있습니다. 아니면 그렇게까지하지 않고 이벤트 기반 프로그래밍 (glib, libev)을 사용하지 않을 수도 있습니다.

스레드 풀을 포함하여 적절한 스레드 추상화가 있으므로 스레드를 사용하기로 결정한 경우에도 Glib은 가치가 있습니다.이렇게하면 X 스레드 풀을 만든 다음 dl/parse 풀을 그 중 하나 (행 번호 % 풀 크기)에 추가하기 때문에 파일을 매우 쉽게 분할 할 수 있습니다.

다운로드 속도가 빨라지면 http 라이브러리에 이미 관련 기능이 있습니다. 곱슬 곱슬함에는 흥미로운 example here과 함께 여러 curl_multicalls가 있습니다.

+0

그런데 말풍선 사이에는 [멀티 스레드 1] (http://www.google.com/codesearch/p?hl=en#R2f_w0jVjyE/pub/solaris-freeware/SOURCES/curl- 7.12.2.tar.gz % 7CfL00qoACRlM/curl-7.12.2/docs/examples/multithread.c & d = 7) 필요한 항목 일 수도 있습니다. – mhd