Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让C中的多个线程在二维数组的同一for循环上工作?_C_Multithreading_Concurrency_Pthreads_Mutex - Fatal编程技术网

如何让C中的多个线程在二维数组的同一for循环上工作?

如何让C中的多个线程在二维数组的同一for循环上工作?,c,multithreading,concurrency,pthreads,mutex,C,Multithreading,Concurrency,Pthreads,Mutex,我有一个C语言的程序 我用pthread_create创建了3个线程,并创建了一个互斥锁 以锁定/解锁关键区域 pthread_create的3nd参数是指向线程将执行的函数的指针 在我在Web上找到的示例中,此函数总是非常简单,例如打印线程id或打印消息 当线程要执行的函数包含for循环时会发生什么情况? 因为在我的程序中,我希望每个线程都使用二维数组 每个线程应找到二维数组中一条线的和。 e、 g Thread1应计算二维数组第一行的总和 螺纹2应计算第二行的总和 螺纹1应计算第三条线的总和

我有一个C语言的程序

我用pthread_create创建了3个线程,并创建了一个互斥锁 以锁定/解锁关键区域

pthread_create3nd参数是指向线程将执行的函数的指针

在我在Web上找到的示例中,此函数总是非常简单,例如打印线程id或打印消息

当线程要执行的函数包含for循环时会发生什么情况?

因为在我的程序中,我希望每个线程都使用二维数组

每个线程应找到二维数组中一条线的和。 e、 g

Thread1应计算二维数组第一行的总和

螺纹2应计算第二行的总和
螺纹1应计算第三条线的总和
螺纹3应计算第三条线的总和

我不关心线程的顺序,但我需要每个线程 穿线以选择其中一条线

下面的代码对二维数组中的两个单元格求和

该方案:

  • 创建多个线程

     for(i=0; i < NTHREADS; i++)
        {
           pthread_create( &thread_id[i], NULL, CalculateSum, NULL );
        }
    
    (i=0;i { pthread_create(&thread_id[i],NULL,CalculateSum,NULL); }
  • 每个线程等待其他线程完成

    for(j=0; j < NTHREADS; j++)
       {
          pthread_join( thread_id[j], NULL);
       }
    
    (j=0;j { pthread_join(thread_id[j],NULL); }
  • 每个线程应执行的函数,但对于阵列的一行,而对于整个阵列的,则为

    void *CalculateSum(void *dummyPtr)
    {
       pthread_mutex_lock( &mutex1 );
    
     int i,j,sum = 0;
    
      for( i = 0; i <= N-1; i++) {
            for( j = 0; j <= M-1; j++) {
                    sum = dimensional_array[i][j] + dimensional_array[i][j];
            }
             printf(" Sum = %d\n", sum);
            }
    
       counter++;
    
       pthread_mutex_unlock( &mutex1 );
    }
    
    void*CalculateSum(void*dummyPtr)
    {
    pthread_mutex_lock(&mutex1);
    int i,j,和=0;
    
    对于(i=0;i计算一行的总和(忽略线程内容):


    编辑:放入“计数器++”返回。

    您应该创建一个每个线程的参数数组,并将这些参数逐个传递给线程。在您的情况下,一个指向
    int
    的指针就足够了:您将其索引
    threadindex
    从零传递给
    NTHREADS
    ,线程将行的总和传递回
    行%NTHREADS==t线程索引

    以下是线程函数的外观:

    void *CalculateSum(void *args)
    {
        int *argPtr = args;
    
        int i,j,sum = 0;
        int threadindex = *argPtr;
    
        for( i = 0; i <= N-1; i++) {
            if (i % NTHREADS != threadindex) continue;
            for( j = 0; j <= M-1; j++) {
                sum += dimensional_array[i][j];
            }
        }
    
        pthread_mutex_lock( &mutex1 ); Mutex must go here
        counter++;
        pthread_mutex_unlock( &mutex1 );
        // Pass the value back:
        *argPtr = sum;
    }
    
    
    main()
    {
        pthread_t thread_id[NTHREADS];
        int thread_args[NTHREADS];
        int i, j;
    
        pthread_mutex_init(&mutex1, NULL);
    
        for (i = 0; i <= N - 1; i++ )
            for( j = 0; j <= M - 1; j++)
                dimensional_array[i][j] = i;
    
        for(i=0; i < NTHREADS; i++)
        {
            thread_args[i] = i;
            pthread_create( &thread_id[i], NULL, CalculateSum, &thread_args[i]);
        }
    
        int sum = 0;
        for(j=0; j < NTHREADS; j++)
        {
            pthread_join( thread_id[j], NULL);
            sum += thread_args[i];
        }
    
        printf("Final counter value: %d. Total: %d\n", counter, sum);
    }
    
    void*CalculateSum(void*args)
    {
    int*argPtr=args;
    int i,j,和=0;
    int threadindex=*argPtr;
    
    对于(i=0;i将sum=dimensional_array[i][j]+dimensional_array[i][j];更改为sum+=dimensional_array[i][j];此外,在该循环中,在for之后添加sum=0(i=0;i如果多个线程都在一个关键部分内执行,那么运行多个线程有什么意义,本质上是将它们自己简化为单线程运行?是的,我很困惑,这是一个我必须做的练习,我们应该使用多个线程(而不仅仅是一个线程)访问一行二维数组,但我不知道怎么做这将是我的答案,但我认为(如果我错了,请纠正我),因为每个线程只读取数组,所以实际上不需要互斥锁-使程序在多核处理器上运行速度提高3倍:)是的,我认为也不需要互斥,但显然这是OPs任务的一部分。重新检查后,它看起来是用来访问全局“计数器”的我遗漏了一个变量。啊,是的,我现在明白了。对于“counter”变量,你最肯定会这样做-你想把它放在@JohnnyI中吗?我对int-threadindex argPtr;有问题,我得到了一个类似于program的错误。c:在函数“CalculateSum”中:program.c:23:错误:在“token program”之前应该是“=”、“、”、“、”、“;”、”asm”或“attribute”。c:26:错误:'threadindex'未声明(首次在此函数中使用)程序。c:26:error:(每个未声明的标识符只报告一次程序。c:26:error:对于它出现在其中的每个函数。)@programmer是的,确实缺少一个
    =
    void *CalculateSum(void *dummyPtr)
    {
        int j,sum = 0;
    
        int i = (int)dummyPtr;
        for( j = 0; j <= M-1; j++) {
            sum += dimensional_array[i][j];
        }
        printf(" Sum = %d\n", sum);
    
        pthread_mutex_lock( &mutex1 );
        counter++;
        pthread_mutex_unlock( &mutex1 );
    }
    
    int line_number = 2;    // Or whatever line to print`enter code here`
    pthread_create( &thread_id[i], NULL, CalculateSum, (void *)line_number );
    
    void *CalculateSum(void *args)
    {
        int *argPtr = args;
    
        int i,j,sum = 0;
        int threadindex = *argPtr;
    
        for( i = 0; i <= N-1; i++) {
            if (i % NTHREADS != threadindex) continue;
            for( j = 0; j <= M-1; j++) {
                sum += dimensional_array[i][j];
            }
        }
    
        pthread_mutex_lock( &mutex1 ); Mutex must go here
        counter++;
        pthread_mutex_unlock( &mutex1 );
        // Pass the value back:
        *argPtr = sum;
    }
    
    
    main()
    {
        pthread_t thread_id[NTHREADS];
        int thread_args[NTHREADS];
        int i, j;
    
        pthread_mutex_init(&mutex1, NULL);
    
        for (i = 0; i <= N - 1; i++ )
            for( j = 0; j <= M - 1; j++)
                dimensional_array[i][j] = i;
    
        for(i=0; i < NTHREADS; i++)
        {
            thread_args[i] = i;
            pthread_create( &thread_id[i], NULL, CalculateSum, &thread_args[i]);
        }
    
        int sum = 0;
        for(j=0; j < NTHREADS; j++)
        {
            pthread_join( thread_id[j], NULL);
            sum += thread_args[i];
        }
    
        printf("Final counter value: %d. Total: %d\n", counter, sum);
    }