【问题标题】:How can i synchronize this code using barrier?如何使用屏障同步此代码?
【发布时间】:2014-03-12 04:54:12
【问题描述】:

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

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

【问题讨论】:

    标签: c multithreading pthreads sync


    【解决方案1】:

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

    有4个步骤:

    1. 声明一个pthread_barrier_t barr;
    2. 调用pthread_barrier_init(&barr, NULL, NUM_THREADS);
    3. 调用 pthread_barrier_wait(&barr); 您要同步线程的位置
    4. 摧毁屏障。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2015-01-04
      • 2021-12-02
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多