2011-02-10 3 views
8

커맨드 라인 입력을 기반으로하는 스레드의 수인 멀티 스레드 프로그램을 작성하려고하므로 미리 선언 된 스레드를 하드 코딩 할 수 없습니다. 이것이 올바른 방법인가?n 개의 스레드를 생성하는 방법은 무엇입니까?

int threads = 5; // (dynamic, not hard-coded) 
int i = 0; 
pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 
    pthread_t foobar; 
    thread[i] = foobar; // will this cause a conflict? 
} 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, (void *)&foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

여기 아래에 제시 수정에서 내 결과입니다. 잘 작동하는 것 같습니다.

int threads = 5; 
int i; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
    // pthread_join(thread[i], NULL); // don't actually want this here :) 
} 

sleep(1);  // main() will probably finish before your threads do, 
free(thread); // so we'll sleep for illustrative purposes 
+2

int 쓰레드는 정수 쓰레드를 argth = argv [3] 비트에 할당 할 수 없다. 'atoi' 또는 sscanf –

+0

을 사용해 주셔서 감사합니다. 맞습니다. 결정된. –

+0

글쎄,'pthread_join()'이있는 곳에서 스레드를 생성하고 다음 스레드를 생성하기 전에 스레드가 끝날 때까지 기다려야합니다. 그래서 사실 당신은 여기에 준 단일 쓰레드 일 겁니다. –

답변

7

첫 번째주기는 무엇입니까? 배열 요소를 초기화되지 않은 값으로 설정합니까?

그래서 나는 당신이 필요로하는 무슨 생각 :

int threads = 5, i = 0, ret = -1; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

는 각 foobar_function 시작 스레드 스레드를 생성합니다. 그리고 당신은 (모든 것이 잘된다면) 어레이에있는 그들의 id를 가지고 있습니다. 따라서 예를 들어 pthread_cancel(thread[1]) 등을 호출하여 두 번째 스레드를 취소 할 수 있습니다.

+0

@Brian D :'pthread_create()'의 세 번째 매개 변수로 지정한 스레드를위한 함수. –

+0

네, 그게 내가하려는 일이라고 생각합니다. 위의 예제에서는 정적 인 pthread 수이므로'pthread_t t1;'과'pthread_t t2;'라고 쓰고 두 개의 다른 함수로 초기화합니다. 동적으로 n 개의 스레드를 만듭니다. –

+0

@Brian D : 그 부분을 건너 뛰기 만하면됩니다 (pthread_t의 특성을 알 수 없으므로 어떤 것도 정의되지 않은 상태로 설정할 수 없습니다). 두 번째주기에서 스레드의 ID를 얻고 스레드를 시작합니다. –

1

첫 번째 for 루프가 유효하지 않으며 원하는 작업을 잘 모르겠습니다. 그냥 그것을 제거하고 나머지 코드는 foobar_function의 잘못된 캐스트를 제외하고 괜찮아 보입니다. 캐스트가 다음과 같아야합니다.

(void *(*)(void *))foobar_function 

유형이 이미 있거나 매우 가까운 경우가 아니면 프로그램에 정의되지 않은 동작이있을 수 있습니다. 함수 서명을 수정하여 캐스트가 필요 없도록하는 것이 좋습니다.

+0

그래, 네 말이 맞아. 고마워. –

-2

멀티 스레드 프로그램을 작성하려고하지만 동적 크기 데이터 구조를 할당하는 방법을 모르면 이 잘못된 일 수 있습니다.

실행하기 전에 걷는 법을 배우십시오.

더 쉬운 언어를 사용하고 (명시 적) 쓰레드를 사용하지 않는 것이 좋습니다.

스레드를 올바르게 사용하는 것은 매우 어렵습니다. 동적으로 크기가 정해진 배열은 매우 쉽다. (C 언어도 상당히 쉽다.)

+0

숙제를 할 때 언어 나 명시 적 쓰레드를 사용할 수있는 선택의 여지가 거의 없습니다 :) –

관련 문제