2011-05-11 7 views
1

C 언어로 된 멀티 스레드 프로그램을 작성하고 싶습니다. 내가 posix 스레드 라이브러리를 사용합니다. 단지 배열의 항목을 표시 c 멀티 스레딩 과정

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

void *put (int *arg) 
{ 
    int i; 
    //int * p; 
    // p=(int*)arg; 
    for(i=0;i<5;i++) 
    { 
     printf("\n%d",arg[i]); 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    int a[5]={10,20,30,40,50}; 
    pthread_t s; 
    pthread_create(&s,NULL,put,a); 
    printf("what is this\n"); 
    return 0; 
} 

난 그냥 내 스레드를 원하는 :

나는 다음과 같은 코드를 작성합니다. 다음과 같은 경고와 함께 컴파일 된 프로그램 :

tm.c:19: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type 
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(int *)’ 

나는 내가 메인 스레드의 넣어 밖으로있어 프로그램이 아닌 배열에 저장된 값을 실행

.

이제 내가 뭘 잘못하고 있다고 말할 수 있습니까? 스레드 함수에서 배열을 인수로 보내는 방법은 무엇입니까?

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


void *put (void *arg) 
{ 
    int i; 
    int * p; 
    p=(int*)arg; 
    for(i=0;i<5;i++) 
    { 
     printf("\n%d",p[i]); 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    int a[5]={10,20,30,40,50}; 
    pthread_t s; 
    pthread_create(&s,NULL,put,a); 
    printf("what is this\n"); 
    return 0; 
} 

그러나 출력이 변경되지 않습니다 : 난 그냥 코드를 약간 변경 한 경우

는 컴파일시 경고가 변경된 코드는 다음입니다 해결. 아무도 내가 뭘 잘못했는지 말해 줄 수 있니? 스레드 함수에 배열을 보내는 적절한 방법은 무엇입니까 (이 경우)?

답변

5

코드가 스레드를 생성 한 후 main 끝에 도달하면 프로세스가 종료됩니다. 쓰레드가 실행될 기회를 기다리거나, pthread_join을 호출하거나, 잠자 지 기다려야합니다.

0

먼저 스레드가 완료 될 때까지 기다린 후 main()에서 돌아 오기 전에 기다려야합니다.

이 코드의 또 다른 문제점은 배열 amain() 루틴 스택에 할당되어 다른 스레드의 컨텍스트에서 유효하지 않을 수 있다는 것입니다. 힙을 malloc()으로 전화하여 a을 할당해야합니다.

main()에서 스레드가 완료 될 때까지 대기하는 경우 main()의 스택 프레임이 계속 존재하므로 a이 유효 할 수 있습니다. 그러나 이후의 모든 리팩터링은 슬픔을 유발할 수 있으므로 malloc()으로 전환하십시오.

0

시도는 return 0;

전에

pthread_join(s, NULL); 

을 스레드가 실행하는 대기 추가