2012-04-08 1 views
1

私はRichard StevensのUNIX環境でのAdvance Programmingを読んでいます。
スレッド同期カテゴリ(章 - 11)にコードがあります。 これは、同じタイプの多くの共有構造の競合状態を回避する方法を示すコードです。
このコードはfoo
を構成するためのコードを2つのリストfhためsynch.-いずれかのミューテックス(全てFOO構造を追跡するリスト)& f_nextフィールドと別の例を示すである。このキャストとアサインメントについては何ですか?

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

#define NHASH 29 
#define HASH(fp) (((unsigned long)fp)%NHASH) 

struct foo *fh[NHASH]; 

pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER; 

struct foo { 
    int    f_count; 
    pthread_mutex_t f_lock; 
    struct foo  *f_next; /* protected by hashlock */ 
    int    f_id; 
    /* ... more stuff here ... */ 
}; 

struct foo * foo_alloc(void) /* allocate the object */ 
{ 
    struct foo *fp; 
    int   idx; 

    if ((fp = malloc(sizeof(struct foo))) != NULL) { 
     fp->f_count = 1; 
     if (pthread_mutex_init(&fp->f_lock, NULL) != 0) { 
      free(fp); 
      return(NULL); 
     } 
     idx = HASH(fp); 
     pthread_mutex_lock(&hashlock); 
     ///////////////////// HERE ----------------- 
     fp->f_next = fh[idx]; 
     fh[idx] = fp->f_next; 
     //////////////////// UPTO HERE ------------- 
     pthread_mutex_lock(&fp->f_lock); 
     pthread_mutex_unlock(&hashlock); 
     /* ... continue initialization ... */ 
     pthread_mutex_unlock(&fp->f_lock); 
    } 
    return(fp); 
} 

void foo_hold(struct foo *fp) /* add a reference to the object */ 
....... 

HASH(fp)プリプロセッサは何をしているのです
1)疑いがありますか?
私はそれがfpストアであり、そのモジュロを取っているものを型キャストしていることを知っています。しかし、関数foo_allocでは、新たに割り当てられたfoo構造体のアドレスを渡すだけです。
私たちがこれをやっている理由は、これは0から28の間の整数を与えることを知っています。つまり、配列fhに格納します。しかし、なぜ私たちはモジュロのアドレスを取っていますか?なぜそんなにランダム化があるのですか?

2)私は今この2行)もコードで強調表示(やっているこの何をした後、ことを受け入れるとします

fp->f_next = fh[idx]; 
fh[idx] = fp->f_next; 

私はfh[idx]は私がに割り当てられたゴミ値を持つ最初に願っていますがf_next fooのフィールドと次の行で何が起こっているか、同じ割り当てが逆の順序で行われます。

答えて

0

struct foo *fh[NHASH]はハッシュテーブルであり、ハッシュ関数としてマクロを使用します。

1)HASH(fp)fhfpを格納するかを決定するための指標を算出し、それがfpのアドレスを使用して指数を計算するためのキーとしてアドレスを使用します。アドレスをlong型に簡単に型変換できます。

2)は別のチェーンと呼ばれるハッシュの衝突を避けるために、リンクリストを使用して、私は次のタラが正しいと思う、あなたは本の中でそれを確認することができます:

fp->f_next = fh[idx]; 
fh[idx] = fp; 

にFP要素を挿入しますヘッダーがfh[idx]で、fh[idx]の初期値がNULLです。

関連する問題