2010-11-22 11 views
1

私はpthreadsを初めて使っています。私が見てきたすべてのサイトで不必要な情報がたくさんあるようです。C言語の2つの関数でpthreadを使用する

私は2つの関数を持っていますが、今はXとYを呼び出しています。これらはメモリ内のブロックで動作します。あるスレッドがXを実行している場合、他のスレッドが同じブロック上でXまたはYを呼び出さないようにするには、どうすればこれが起こらないことを確認できますか?

特定のブロック値に対して関数をmutexロックする必要がありますか?

答えて

0

のためだけのオール・オア・ナッシングのアプローチおそらく、いくつかのデモコードはオーダーです。

struct block { 
    void *data; 
    size_t len; 
}; 

あなたはこの構造にmutex変数を追加することにより、ブロックを保護する:あなたがそうのようなブロックヘッダを持っていると仮定

struct block { 
    void *data; 
    size_t len; 
    pthread_mutex_t lock; 
}; 

あなたはその後、初期化するために、この構造のための初期化機能を更新する必要がありますロック:

struct block *new_block(size_t len) 
{ 
    struct block *b = malloc(sizeof *b); 
    b->data = malloc(len); 
    b->len = len; 

    pthread_mutex_init(&b->lock, NULL); 

    return b; 
} 

X及びYの関数(及び読み取りまたはブロックに書き込む任意他の機能)を必要

int x(struct block *b) 
{ 
    int retval; 

    pthread_mutex_lock(&b->lock); 

    /* code */ 

    pthread_mutex_unlock(&b->lock); 
    return retval; 
} 

int y(struct block *b) 
{ 
    int retval; 

    pthread_mutex_lock(&b->lock); 

    /* code */ 

    pthread_mutex_unlock(&b->lock); 
    return retval; 
} 

エラーリターンパスでもミューテックスをロック解除するように注意する必要があります。

2

ミューテックスを使用する必要があります。

コードをロックしないでください。データをロックする必要があります。ブロックごとにミューテックスを作成し、関数がブロック上で動作している間はロックし、終了するとロックを解除します。

mutexは、pthread.h、pthread_mutex_tで定義される型です。 mutexのロックとロック解除のための関数が用意されています。これらの関数は、一度に1つのスレッドだけがロックを獲得できるようにします(ブロックを使用していることを示すために変数を使用した場合、そのブロックではなくその変数に並行性の問題が発生します)。

オンラインで利用可能なチュートリアルが多数あります。 Googleの "pthread tutorial"とあなたは十分にあなた自身を始めるために見つける必要があります。

+0

ご返信ありがとうございます。だから私はちょうどそれが読み書きされているかどうかを示すブロックと一緒に値を格納する必要がありますか(func。X&Y)? (私はミューテックスについて新しいです)? – Alex

+1

@Alex pthread_mutex_lock(mutex)を呼び出すだけで、mutexが解放されるまでは返りません。 – Ben

+1

各ブロックに 'pthread_mutex_t'値を設定するか、メモリのブロックとロックのテーブルの間に1対1のマッピングを作成することができます。しかし、スレッドがロックを待っている時間を多く費やしたくないので、同じメモリにアクセスしたい別のスレッドを避けてください。 – nategoose

1

リソース(この場合はメモリブロック)をミューテックスでロックします。 また、そのメモリ領域を読み書きする関数コードの部分だけをロックすることもできます。これはクリティカルセクションと呼ばれ、コーディングには異なるアタックが必要です。これは、リソースと対話する部分にヒットした場合を除いて、スレッドが自由に動作できることを意味します。

第一の方法は、実装が簡単である - 全体の機能のXまたはYの

+0

ご返信ありがとうございます。だから私はちょうどそれが読み書きされているかどうかを示すブロックと一緒に値を格納する必要がありますか(func。X&Y)? – Alex

0

マルチスレッドプログラミングは、より高水準の言語を使用して実際にはよりよく解決されます。 C言語では理解できないものもあります。私の考えでは、マルチスレッド化もその一つです。私は、Javaが私に問題と問題のためのより良い感じを与えたことを発見しました。概念を理解しやすく、ドキュメントを読みやすくなっています。 Javaがあなたのものでないなら、PocoやQtのようなC++フレームワークも良いでしょう。

他の人が言ったように、概念的にはリソース(あなたの場合はメモリセクション)をロックしたいと思っています。セマフォーは概念として、ミューテックスよりもはるかに優れています。私はセマフォを研究し、ミューテックスをセマフォのビルディングブロックと考えることにします。あなたが私に尋ねるならば、ミューテックスは、よく知られていないバイナリセマフォです。

関連する問題