使用Android NDK + pthreads时应用程序崩溃

时间:2014-12-11 14:50:16

标签: android android-ndk crash pthreads

我需要编写一个简单的程序来测量用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超出了界限。

0 个答案:

没有答案