【问题标题】:Trying out with some code to make use of multithreading in C尝试使用一些代码来利用 C 中的多线程
【发布时间】:2022-01-13 06:42:52
【问题描述】:

我有一个可以产生任意数量线程的应用。所以我希望这段代码变成多线程的

void *some_thread_fuction(void *param)
{
    struct some_struct *obj=(struct some_struct *)param;
    int m=obj->m;
    int n=...
    double t[m+2][n+2]={0};
    
    for (i=0; i <= m+1; i++) {
        for (j=0; j <= n+1; j++) {
            t[i][j] = 30.0;
        }
    }


    for (i=1; i <= m; i++) {
        t[i][0] = 40.0;
        t[i][n+1] = 90.0;
    }
    for (j=1; j <= n; j++) {
        t[0][j] = 30.0;
        t[m+1][j] = 50.0;
    }
    memcpy(global_t,t,...);
}

我有一个简单的推理问题,为什么我喜欢让它成为一个多线程程序。但这是有道理的,因为如果我有 5 个线程(假设我在程序参数中在程序启动时产生多少线程)并且 n=20 m=20 也在程序启动时作为参数输入,那么我可以尝试工作在一个线程中为 0-4,在第二个线程中为 5-8,依此类推,直到第一个循环的最后一次迭代中为 16-20(只是一个示例,因为 m=etc n=etc 和线程数可以是用户提供的任何值)。

但更重要的是,我很难理解如何剖析三个for 循环,以将处理工作量分配给多个线程,以完成此代码中的所有循环。这是一个简单的代码,所以它只是一个真实的例子,我很难理解如何在这个场景的线程程序的代码中完成它。

【问题讨论】:

  • 所以你想产生线程并在矩阵中给出开始和结束偏移作为线程参数?
  • @kiner_shah 听起来你明白。感谢您的评论
  • @kiner_shah 很简单

标签: c multithreading


【解决方案1】:

将这段代码移动到一个函数中:

    for (i=0; i <= m+1; i++) {
        for (j=0; j <= n+1; j++) {
            t[i][j] = 30.0;
        }
    }

如下:

void initialize(double t[], int start_i, int end_i, int n) {
    for (i=start_i; i <= end_i; i++) {
        for (j=0; j <= n+1; j++) {
            t[i][j] = 30.0;
        }
    }
}

然后您可以将区间 [0 m+1] 拆分为 5 个区间,并为每个区间从每个线程调用初始化函数。

也就是说,必须有更有效的方法来使用一些复制指令来实现相同的目标。

【讨论】:

  • 请告诉我是否需要自己实现 40 90 50 的功能。你把它留给我做练习了吗?或者我可以使用相同的功能来编辑我认为的值。
  • 好吧,我相信你明白了。
猜你喜欢
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2023-03-31
相关资源
最近更新 更多