如何使用屏障同步此代码?

时间:2014-02-13 10:52:47

标签: c multithreading pthreads sync

我正在编写一个用于实现矩阵乘法的并行程序。

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);

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找 pthread障碍。您可以找到文档here

有4个步骤:

  1. 声明 pthread_barrier_t barr;
  2. 致电 pthread_barrier_init(&amp; barr,NULL,NUM_THREADS);
  3. 致电 pthread_barrier_wait(&amp; barr); 您想要同步线程
  4. 消灭障碍。