我需要编写一个简单的程序来测量用NDK + pthreads实现矩阵乘法的执行时间。不幸的是,一旦请求计算,应用程序就会崩溃。在logcat中没有消息,也没有像“你的应用程序崩溃”这样的对话窗口。下面是可能发生崩溃的代码片段:
... //Include headers, declare variables and stuff like that
void* calculate_row(void* row)
{
int x = *((int *) row);
for (int i = 0; i < n; i++)
{
C[x][i] = 0;
for (int j = 0; j < n; j++)
{
C[x][i] += A[x][j]*B[j][i];
}
}
return NULL;
}
jdouble Java_com_example_avl_ndktest_Main_calculateProductTime(JNIEnv *env, jobject obj, jint a)
{
... //Initializing and so on
clock_t startTime = clock();
pthread_t *threads = (pthread_t*) malloc(n*sizeof(pthread_t));
for (int i = 0; i < n; i++)
{
pthread_create(&threads[i], NULL, calculate_row, (void *) &i);
}
for (int i = 0; i < n; i++)
{
pthread_join(threads[i], NULL);
}
clock_t elapsedTime = (clock()-startTime);
free(A);
free(B);
free(C);
free(threads);
return (double) (elapsedTime)/CLOCKS_PER_SEC;
}
请注意,非pthread版本不会崩溃并且无法正常运行。此外,这些线程不与VM交互,因此我没有将它们绑定到它。对于我的问题,我将不胜感激。
UPDATE 可以通过更改
来解决问题pthread_create(&threads[i], NULL, calculate_row, (void *) &i);
到
pthread_create(&threads[i], NULL, calculate_row, (void *) i);
和
int x = *((int *) row);
到
int x = (int *) row;
似乎在初始化x时,i的值可能已经不足,并且按地址检索此值必然会导致崩溃,因为x超出了界限。