2014-02-13 1 views
0

매트릭스 곱셈을 구현하기위한 병렬 프로그램을 작성 중입니다.장벽을 사용하여이 코드를 어떻게 동기화 할 수 있습니까?

main 함수에서 먼저 스레드 풀 (= num_threads)을 만든 다음 각 스레드에 mult 함수를 구현합니다. 이 스레드 각각은 출력 행렬의 일부 행을 계산합니다.

그러나 얻은 결과가 올바르지 않습니다.

메인 스레드가 for 루프를 종료하고 풀을 비울 때 모든 스레드가 생성되지 않았기 때문입니다. (스레드 pool_free 함수는 스폰 된 스레드가 완료 될 때까지 대기합니다).

sleep(1)을 사용하면 모든 스레드가 생성 될 충분한 시간이 주어지며 얻은 결과는 괜찮지 만이 코드의 실행 시간을 추적해야하므로 sleep을 제거 할 수있는 방법이 있습니다.

gettimeofday(&start, NULL); 

int i1[num_threads];; 
for(i=0;i<num_threads;i++){ 
    i1[i] = i; 
    int err = threadpool_add_task(pool,Mult,(void *)&i1[i],1); 
} 

//sleep(1); 

threadpool_free(pool,1); 
    gettimeofday(&end, NULL); 

답변

0

난 당신이 는 pthread 장벽를 찾고 있습니다 생각합니다. 당신은 here

4 단계가 있습니다 문서를 찾을 수 있습니다

  1. pthread_barrier_t의 바 선언;
  2. 전화 pthread_barrier_init (& barr, NULL, NUM_THREADS);
  3. 전화 pthread_barrier_wait (& barr); 스레드를 동기화하려는 곳
  4. 장벽을 파괴하십시오.
관련 문제