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