2

ここで何か馬鹿げたことをしているのではないかと思いますが、構造体に埋め込まれたrwlockでpthread_rwlock_init()を実行しようとすると、組み込みLinuxプラットフォーム(GCCコンパイラ)でセグメンテーション違反が発生します。

struct rwlock_flag {
    int flag;           // Flag
    pthread_rwlock_t * rwlock;  // Reader/writer lock for flag
};

次の原因でセグメンテーション違反が発生します。

struct rwlock_flag * running;
running = (struct rwlock_flag *) malloc (sizeof(struct rwlock_flag));
rslt = pthread_rwlock_init(running->rwlock, NULL);

これもそうです...

pthread_rwlock_t * rwlock_dg2;
pthread_rwlock_init(rwlock_dg2,NULL);

ただし、以下は正常に機能します...

pthread_rwlock_t rwlock_dg;
pthread_rwlock_init(& rwlock_dg,NULL);

何かご意見は?

4

1 に答える 1

8

最初のケースと2番目のケースはどちらも、どこも指さないポインターのrwlockを初期化しようとします(技術的には、ランダムまたはNULLの場所を指します)。

最初のケースでは、ラッパー構造にスペースを割り当てますが、ラッパー構造pthread_rwlock_t*内には割り当てません。したがって、ランダムな場所を指します。

これはpthread_rwlock_t、1つのポインタではなく、実際のポインタで機能します。

struct rwlock_flag {
    int flag;                 // Flag
    pthread_rwlock_t rwlock;  // Reader/writer lock for flag
};
struct rwlock_flag * running;
running = (struct rwlock_flag *) malloc (sizeof(struct rwlock_flag));
rslt = pthread_rwlock_init(&(running->rwlock), NULL);

2つ目も同様に、バッキングストレージがないrwlock_dg2ため、ランダムな場所(関数内で割り当てられている場合)またはNULL(ファイルレベルで宣言されている場合)を指します。必要なもの:

pthread_rwlock_t * rwlock_dg2 = malloc (sizeof (pthread_rwlock_t));
pthread_rwlock_init(rwlock_dg2,NULL);

3番目のケースは機能しますが、これは、ポインター&rwlock_dgが実際に実数を指しているためpthread_rwlock_tです(もちろんrwlock_dgです)。

于 2010-05-26T16:45:15.037 に答える