私は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のフィールドと次の行で何が起こっているか、同じ割り当てが逆の順序で行われます。