1

2 つのスレッドを持つ pthread プログラムがあります。最初のスレッドは Array[0 - 196607] に書き込み、2 番目のスレッドは Array[196608 - 393215] に書き込みます。

配列要素 [33779 ~ 393215] にアクセスすると、「アドレス ... のメモリにアクセスできません」というエラーが表示されます。このため、セグメンテーション違反が発生しています。この問題のデバッグを進める方法を教えてください。

次の質問は、スレッドが同じ配列の異なるアドレス位置に書き込んでいる場合、それらにロックを使用する必要があるかということです。

関連するコードは

main.cpp の内容

#include <stdio.h>
#include <stdlib.h>
#include "a.cpp"


int *array;

int main() {
   array = new int[393216];
   foo(array);
   return 0;
}

a.cpp の内容

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


struct a {
   int array[];
};

pthread_mutex_t mutex;

void *funcname (void* param) {
    struct a *data = (struct a*) param;
    int index = 33779;
    pthread_mutex_lock(&mutex);
    data->array[index] = 1;
    pthread_mutex_unlock(&mutex);
}


void foo (int array[]) {
    struct a* data[2];
    pthread_mutex_init(&mutex, NULL);

    pthread_t threads[2];

    for ( int i = 0 ; i < 2 ; ++i) {
        data[i] = (struct a*)malloc (sizeof(struct a));
        *data[i]->array = *array;
        pthread_attr_t attr;
        pthread_attr_init(&attr);

        pthread_create (&threads[i], NULL, funcname, data[i]);

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

    }

前もって感謝します!

4

1 に答える 1

0
*data[i]->array = *array;

最初の要素をコピーするだけです。あなたが使用することができます

struct a { int* array; }

次に、ポインタをコピーするだけです。

data[i]->array = array;
于 2013-08-20T09:31:30.843 に答える