2014-12-16 3 views
4

병렬 스레드를 만들고 싶습니다. 예 : 내 출력은 같은 것입니다 : thread1 thread3 thread4 thread2 ... 주에서 :스레드가 병렬 실행되지 않음

pthread_t tid; 
int n=4; 
int i; 
for(i=n;i>0;i--){ 
    if(pthread_create(&tid,NULL,thread_routine,&i)){ 
     perror("ERROR"); 
    } 
    pthread_join(tid,NULL); 
} 

그리고 내 기능 (루틴)입니다 : thread1 thread2 thread3 :

void *thread_routine(void* args){ 
    pthread_mutex_lock(&some); 
    int *p=(int*) args; 
    printf("thread%d ",*p); 
    pthread_mutex_unlock(&some); 
} 

난 항상하지 병렬 결과를 얻었다 thread4. 이 스레드를 같은 시간에 병렬로 실행하고 싶습니다. 어쩌면 문제는 위치 pthread_join이지만 어떻게 해결할 수 있습니까?

+1

'& i'을 스레드 인수로 전달하면 스레드가 인쇄하기 전에'i'가 변경 될 수 있으므로 문제가 발생할 수 있습니다. 가장 간단한 수정은 포인터 대신'i' 캐스트를 전달하는 것입니다. (이것은 당신이받은 답안에 이미 언급 된'join()'문제에 추가됩니다) – Dmitri

+0

@Dmitri 네, 여기가 문제입니다. –

답변

3

모든 스레드를 시작한 후에 스레드에 참가하고 싶습니다. 현재 귀하의 코드는 스레드를 시작한 다음 조인하고 다음 스레드를 시작합니다. 본질적으로 순차적으로 실행되도록하는 것입니다.

그러나 출력이 변경되지 않을 수 있습니다. 이는 출력이 변경되지 않을 수도 있습니다. 그 이유는 해당 스레드가 먼저 잠금에 도달했기 때문입니다.

+0

Soo는 병렬로 작동하도록 수정하는 옵션이 없습니다. –

+1

수정 사항은 조인 문으로 첫 번째 루프 다음에 두 번째 루프가 있어야합니다. 그러나 코드가 없기 때문에 스레드를 독자적으로 끝내고 join 문을 완전히 제거 할 수 있습니다. – dhalik

+0

for for join 문을 for for new로 사용하면 결과가 좋지 않습니다. 그것 같이 : thread3 thread3 thread3 thread1 또는 그런 것. –

0

예, 조인은 방금 생성 된 스레드가 종료 될 때까지 주 스레드가 다른 스레드를 계속 생성하지 못하도록 차단하므로 모든 스레드가 동시에 실행되는 것을 차단합니다. 조인을 제거하면 조인이 동시에 실행됩니다. (비록 당신의 시스템에 따라 여전히 병렬하지는 않을지라도)

그러나 출력에 어떤 차이점도 없을 수도 있습니다.

관련 문제