Python中ctypes和多处理的内存问题

2024-04-25 18:53:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python代码,它使用ctypes来完成一些繁重的工作。它还使用多重处理。在意识到我在某些代码中犯了一个工程(而不是编程)错误之后,我更新了c子函数,现在我得到了一个

    WindowsError: exception: access violation reading 0x09AA1000

它只在新的c代码和启用多处理时发生。最后的地址每次都不同,在抛出错误之前,代码将成功运行不同的时间长度。以下是旧的(工作)c代码:

    void rfnies(double *array_ext, int tot_num, double *array_out) {
    double *pr, *po, a[16384], ampl, mean;
    int index, j, cNr;
    pr = array_ext;
    po = array_out;

    j = -1;
    cNr = 1;
    for (index=0; index<tot_num; index++) {
        a[++j]=*pr++;
        while ( (j >= 2) && (fabs(a[j-1]-a[j-2]) <= fabs(a[j]-a[j-1])) ) {
            ampl=fabs( (a[j-1]-a[j-2])/2 );
            switch(j)
    {
                case 0: { break; }
                case 1: { break; }
                case 2: {
                    mean=(a[0]+a[1])/2;
                    a[0]=a[1];
                    a[1]=a[2];
                    j=1;
                    if (ampl > 0) {
                        *po++=ampl;
                        *po++=mean;
                        *po++=0.50;
                    }
                    break;
                }
                default: {
                    mean=(a[j-1]+a[j-2])/2;
                    a[j-2]=a[j];
                    j=j-2;
                    if (ampl > 0) {
                        *po++=ampl;
                        *po++=mean;
                        *po++=1.00;
                        cNr++;
                    }
                    break;
                }
            }
        }
    }
    for (index=0; index<j; index++) {
        ampl=fabs(a[index]-a[index+1])/2;
        mean=(a[index]+a[index+1])/2;
        if (ampl > 0){
            *po++=ampl;
            *po++=mean;
            *po++=0.50;
        }
    }
    return;
    }

这是导致访问冲突的新代码。我看不出问题出在哪里,快把我逼疯了!你知道吗

    void rf3(double *array_ext, int tot_num, double *array_out) {
    double *pr, *po, E[tot_num], ampl, mean, XX, YY;
    int index, j, cNr, nn;
    pr = array_ext;
    po = array_out; 
    j=0;
    nn = -1;
    while (j<=tot_num){
        nn++;
        E[nn] = *(pr+j);
        j++;
        while (nn >= 2){
            XX = fabs(E[nn] - E[nn - 1]);
            YY = fabs(E[nn - 1] - E[nn - 2]);
            if (XX<YY){break;}
            ampl=YY/2.0;
            mean=(E[nn - 1] + E[nn - 2])/2.0;
            *po++=ampl;
            *po++=mean;
            *po++=1.00;
            nn = nn - 2;
            E[nn] = E[nn + 2];
        }

    }

}

它将运行不同的时间长度这一事实表明,有些东西留在内存中,而另一个进程正在尝试读取相同的内存。我不能发布一个工作的例子,因为我甚至不能在一些运行的完整代码中重现它!你知道吗

任何帮助都将不胜感激。你知道吗


Tags: 代码indexnnprmeanarraynumext