2

データのマトリックスにアクセスするスレッドの目的のために、一度に1つだけが特定のデータ(x、y)にアクセスできるようにするために、すべてのスレッドがアクセスできるミューテックスのマトリックスが必要です。他にも選択肢があることは理解していますが、本当に必要なのはこれです。グローバルポインタを試し、クライアント/ユーザーからデータマトリックスのサイズを受け取ったときに、そのサイズのミューテックスのマトリックスを割り当てました。それをうまく機能させることができませんでした...配列の配列へのポインタ...私の頭が爆発します。これが私のちっぽけな試みの例です。

xthread_mutex ** globalPointer;

void example_init (int x, int y) {

globalPointer = (xthread_mutex_t **)malloc(sizeof(xthread_mutex_t)* x * y);

int i, j;

for(i=0; i<x; i++){

for(j=0; j<y; j++){

globalPointer[i][j] = xthread_mutex_init();
}
}

ミューテックス初期化のセグメンテーション違反、なぜですか?ポインタと配列を混在させる際の混乱を避けるためのヒントもいくつか教えていただければ幸いです。下は全部同じじゃないですか。

編集:言及しなかったことをお詫びしますが、「カスタム」ミューテックス、xthread_mutex_init()を使用しています。基本的に、割り当てられたロック(pthreadロックを使用して作成された)へのポインターを返します。何も問題が見つからない場合は、それらの間違いを推測します...

/*新しいロック解除されたミューテックスを返します*/

xthread_mutex_t xthread_mutex_init();

4

1 に答える 1

1
globalPointer = (xthread_mutex_t **)malloc(sizeof(xthread_mutex_t)* x * y);

x*yミューテックスにスペースを割り当てます。xthread_mutex_t**しかし、あなたが持っているなら、あなたはそれを単にとして扱うことはできません

globalPointer[i][j]

これは、割り当てられたメモリの先頭からのバイトsizeof(xthread_mutex_t*)のオフセットにあるバイトを(への)ポインタとして解釈します。i*sizeof(xthread_mutex_t)xthread_mutex_t

必要なことを実現する1つの方法は、1次元配列を割り当てることです。

xthread_mutex_t *real_pointer = malloc(x * y *sizeof *real_pointer);

xおよびへのポインタ用のスペースglobalPointer

globalPointer = malloc(x * sizeof *globalPointer);

次に、が指すブロックにポインタを入力しますreal_pointer

for(int i = 0; i < x; ++i) {
    globalPointer[i] = realPointer + i*y;
}

別のオプションは、上記のようにxポインタ用のスペースを割り当ててから、ループ内のこれらの各ポインタにミューテックス用のスペースを割り当てることです。globalPointermallocy

于 2012-12-11T03:00:01.687 に答える