尝试使用一些代码来利用 C 中的多线程

Posted

技术标签:

【中文标题】尝试使用一些代码来利用 C 中的多线程【英文标题】:Trying out with some code to make use of multithreading in 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 很简单 【参考方案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 的功能。你把它留给我做练习了吗?或者我可以使用相同的功能来编辑我认为的值。 好吧,我相信你明白了。

以上是关于尝试使用一些代码来利用 C 中的多线程的主要内容,如果未能解决你的问题,请参考以下文章

Java中的多线程=你只要看这一篇就够了

Java 中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了