14

共有メモリを介して通信するLynxOS SE (POSIX 準拠) システムに 2 つのプロセスを実装しています。

一方のプロセスは「プロデューサー」として機能し、もう一方のプロセスは「コンシューマー」として機能します。マルチスレッドシステムでは、これに対する私のアプローチは、mutex と condvar (条件変数) のペアを使用することです。共有メモリが更新されると、コンシューマーは condvar を待機し ( を使用pthread_cond_wait)、プロデューサーはそれを通知します ( を使用)。pthread_cond_signal

マルチスレッドではなくマルチプロセスのアーキテクチャでこれを実現するにはどうすればよいですか?

プロセス間で使用できる condvar/mutex ペアを作成する LynxOS/POSIX の方法はありますか?
または、このシナリオでは他の同期メカニズムがより適切ですか?

4

4 に答える 4

28

クレジットは@nosに送られますが、彼の答えを少し拡張したいと思います。
最後に(わかりやすくするためにエラー処理を除く)、次のようにしました。

1.共有メモリ構造を定義する

これには、プロセス間同期オブジェクトと共有されるデータが含まれます。

typedef struct
{
    // Synchronisation objects
    pthread_mutex_t ipc_mutex;
    pthread_cond_t  ipc_condvar;
    // Shared data
    int number;
    char data[1024];
} shared_data_t;

2. 共有メモリの作成とサイズの設定 (Master プロセス)

マスター プロセスで、新しい共有メモリ オブジェクトを作成します。

fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(shared_data_t));

2. OR 共有メモリを開く (スレーブ プロセス)

スレーブでは、既存のオブジェクトにアタッチするだけです:

fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);

3. プロセス空間への Mmap

// Specify addr of calling address, mostly use NULL is most portable way
shared_data_t* sdata = (shared_data_t*)mmap(NULL, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);

4. 同期変数の初期化 (マスター プロセスのみ)

pthread_mutexattr_t mutex_attr;
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&sdata->ipc_mutex, &mutex_attr);

pthread_condattr_t cond_attr;
pthread_condattr_init(&cond_attr);
pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&sdata->ipc_condvar, &cond_attr);

それでおしまい。

Mutex と cond を通常どおり使用して、共有データへのアクセスを制御できるようになりました。

唯一の本当の落とし穴は、スレーブ プロセスが開始される前に、マスター プロセスが共有メモリを作成し、同期変数を初期化したことを確認することです。munmap()そして、必要に応じて片付けてくださいshm_unlink()

注: XSI 代替

shmget()POSIX:XSI 拡張機能には、メモリを共有するための他の関数 (など)があり、それらが利用可能であればより便利ですが、私が使用している LynxOS-SE のバージョンにはありませshmat()

于 2010-04-08T23:22:38.360 に答える
8

これは、名前のない POSIX セマフォで行われます。つまり、セマフォ自体が共有メモリに配置されます。

于 2010-04-06T12:48:35.547 に答える
8

プロセス共有ミューテックス/条件を作成する標準的な方法。変数は、pthread_mutexattr_setpshared/pthread_condattr_setpshared を設定する属性でそれらを初期化することです。LynxOS がそれをサポートしているかどうかを確認してください。

当然、そのようなミューテックス/コンドを配置する必要があります。何らかの方法で変数を共有メモリに保存して、すべてのプロセスがそれを使用できるようにします。

于 2010-04-06T17:39:37.760 に答える
6

これは、共有メモリ/セマフォ IPC で実現できます。

良い例を含む記事を次に示します。

http://www-personal.washtenaw.cc.mi.us/~chasselb/linux275/ClassNotes/ipc/shared_mem.htm

于 2010-04-06T12:28:07.163 に答える