gpt4 book ai didi

c - pthread_join 根据随机全局变量值相应挂起

转载 作者:行者123 更新时间:2023-11-30 14:35:16 26 4
gpt4 key购买 nike

我利用 pthreads 构建了这段代码。目标是构建一个数组 X[N][D] 并为其分配随机值。您可以将该数组的元素读取为某些点的系数。

下一步,我尝试计算一个数组 distances[N],它包含最后一个元素(第 N 个元素)与每个其他元素之间的所有距离。距离计算是使用pthreads执行的。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <math.h>

#define N 10
#define D 2 //works for any d
#define NUM_THREADS 8


//double *distances;
//int global_index = 0;
pthread_mutex_t lock;
double *X;

typedef struct
{
//int thread_id;
double *distances;
int *global_index ;
pthread_mutex_t lock;
double *X;

}parms;

void *threadDistance(void *arg)
{
parms *data = (parms *) arg;
double *distances = data->distances;
double *X = data->X;
int *global_idx = data -> global_index;

int idx,j;
//long id = (long)arg;
pthread_mutex_lock(&lock);

while(*global_idx<N)
{
//printf("Thread #%ld , is calculating\n", id);
idx = *(global_idx);
(*global_idx)++;
pthread_mutex_unlock(&lock);
for(j=0 ; j<D; j++)
{
distances[idx] = pow(X[(j+1)*N-1]-X[j*N+idx], 2);
//printf("dis[%d]= ", dis);
//printf("%f\n",distances[idx]);
}
//printf("global : %d\n", *global_idx);
}


pthread_exit(NULL);


}

void calcDistance(double * X, int n, int d)
{
int i;
int temp=0;
pthread_t threads[NUM_THREADS];
double *distances = malloc(n * sizeof(double));

parms arg;
arg.X = X;
arg.distances = distances;
arg.global_index = &temp;

for (i=0 ; i<NUM_THREADS ; i++)
{
pthread_create(&threads[i], NULL, threadDistance, (void *) &arg);
}

for(i = 0 ; i<NUM_THREADS; i++)
{
pthread_join(threads[i], NULL);
}

/*----print dstances[] array-------*/
printf("--------\n");
for(int i = 0; i<N; i++)
{
printf("%f\n", distances[i]);
}
/*------------*/
free(distances);
}

int main()
{

srand(time(NULL));

//allocate the proper space for X
X = malloc(D*N*(sizeof(double)));

//fill X with numbers in space (0,1)
for(int i = 0 ; i<N ; i++)
{
for(int j=0; j<D; j++)
{
X[i+j*N] = (double) (rand() / (RAND_MAX + 2.0));
}

}

calcDistance(X, N, D);


return 0;
}

问题是代码只有在 N=100000 时才能完全执行。如果 N!=100000 代码就会挂起,我发现问题的根源是 pthread_join() 函数。首先,我不明白为什么挂起取决于 N 的值。

其次,我尝试了printf()处理global_index的值(正如您所看到的,它在这个特定的代码示例中被注释掉了)。一旦我取消注释 printf("global : %d\n", *global_idx); 命令,程序就会停止挂起,无论 N 的值如何。

这对我来说似乎很疯狂,因为悬挂和不悬挂之间的差异是如此无关紧要。

最佳答案

关于:

pthread_mutex_lock(&lock); 
while(*global_idx<N)
{
// ...
pthread_mutex_unlock(&lock);

结果是,在循环的第一次迭代之后,互斥锁始终处于解锁状态。建议将对 pthread_mutex_lock() 的调用移至循环顶部。

进行上述更正后,我将N设置为10000。然后重新编译等。结果是一个seg错误事件,所以互斥体的错误处理并不是唯一的问题。

关于:

* First of all I cannot understand why the hang depends on the value of N.*

看来程序实际上是因段错误事件而崩溃,而不是挂起

关于c - pthread_join 根据随机全局变量值相应挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58613188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com