2011-06-25 9 views
3

私は共有メモリに存在するいくつかの変数へのアクセスを同期させるために使用されるmutexを使用したいと思います。どうすればそれを達成できますか?それを実行するコードサンプルは非常に感謝されます。pthreadsを使用したプロセス間mutex

+1

なぜあなたのタイトルは「pthreads」と言うのですが、「プロセス」について質問していますか?とにかくメモリマッピングを使って、プロセス間でどのようにメモリを共有していますか? –

+0

私はフォークする前にメモリを割り当てて共有しています。したがって、1つのプロセスは親プロセスであり、もう1つのプロセスは子プロセスです。 pthreadでは、pthread_mutex_lockの使用を意味していました。 – MetallicPriest

+1

私は 'fork'がメモリの_copies_を作成すると思うので、正確に"共有 "していません。 –

答えて

3

代わりに 1に初期化された POSIX semaphoreを使用してください。 (下記参照)無名セマフォーにはsem_init、名前付きセマフォーにはsem_openを使用してください。

sem_t sem; 

/* initialize using sem_init or sem_open */ 

sem_wait(&sem); 
/* critical region */ 
sem_post(&sem); 

何年も最初はこの回答を投稿した後、それを更新する必要があります。

セマフォの代わりに実際にミューテックスを使用する必要があります。 Rとkugaのコメント(以下で逐語的にコピー)は理由を説明します。特に私はmutexが詰めることによって最も魅力的であるpostであることができることをkugaの言及を見つける。


R

sem_initは ミューテックスのpshared属性を必要とするだけのように、共有される非ゼロの引数psharedが必要です。あなたがロックを保持している間に1つのプロセスが死ぬ (非常に実際の)ケースを扱うことを可能にする強固なミューテックスを使用できるので、実際にはmutexesはより良いでしょう: これはミューテックスよりもセマフォを好む理由はありません。

久我

さらにR..`sポストに、ミューテックスは、それをロックしたスレッド によって投稿することができます。これはしばしば必須であり、セマフォはこの機能を に提供しません。これは正解ではないので、正しい回答として にJeffの答えを示す必要があります。

+1

このコードは十分ですか? – MetallicPriest

+0

@MetallicPriestそれでは? – cnicutar

+0

sem_t型の変数は、プロセス間通信のために特別な初期化を必要とします。 – MetallicPriest

10

次の例は、Pthreadプロセス間ミューテックスの作成、使用、および破棄を示しています。複数のプロセスの例を一般化することは、読者の練習として残されています。

#include <pthread.h> 

pthread_mutex_t shm_mutex; 

int main(void) 
{ 
    int err; 
    pthread_mutexattr_t attr; 
    err = pthread_mutexattr_init(&attr); if (err) return err; 
    err = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); if (err) return err; 
    err = pthread_mutex_init(&shm_mutex, &attr); if (err) return err; 
    err = pthread_mutexattr_destroy(&attr); if (err) return err; 
    err = pthread_mutex_lock(&shm_mutex); if (err) return err; 
    err = pthread_mutex_unlock(&shm_mutex); if (err) return err; 
    err = pthread_mutex_destroy(&shm_mutex); if (err) return err; 
    return 0; 
} 
関連する問題