3

私は Win32 プログラミングにかなり慣れていません。2 つのプロセス間で共有メモリを作成したいと考えています。メモリ マッピング機能を使用して、既に共有メモリを作成しています。

私の構造体はこれになります:

struct sharedMemory
{
  int ans1;
  int ans2;
  BOOLEAN flag1;
};

これで、さまざまなプロセスからこの共有メモリにアクセスできるようになりましたが、この共有メモリにロックを適用して、1 つのプロセスのみが構造体メンバー変数にアクセスできるようにする方法について混乱しています。

4

4 に答える 4

7

を呼び出すときにミューテックス名を指定するとCreateMutex、ミューテックスが他のプロセスから見えるようになります。

別のプロセスが同じ名前を に渡すと、CreateMutex(新しいミューテックスを作成する代わりに) 既存のミューテックスが取得され、プロセス間の同期に使用できます。

于 2012-10-02T22:01:43.010 に答える
1

共有メモリは、さまざまなプログラムのアドレス空間にロードされたメモリのページにすぎないため、共有メモリはプロセスのアクセスとは関係ありません。Windows や Posix を含む任意の OS でこれを処理するには、独自の同期メカニズムを作成する必要があります。

これを処理するには、プロセスが別のプロセスにデータの準備ができたことを通知する必要があります (Win32 では名前付きイベントを使用できます。詳細については、 CreateEvent を参照してください)。別のステップは、同期メカニズムを介した共有メモリへの排他的アクセスです。 (Win32 では、名前付きミューテックスを使用してこれを実現できます。詳細については、CreateMutex を参照してください)。

于 2012-10-02T22:01:33.627 に答える
0

少し混乱していますが、メモリ マップ ファイルはスレッド セーフです。多数のスレッドが、読み取りおよび読み取り/書き込みアクセスで 1 つ以上のファイル ビューにアクセスできます。

とにかく、1 つのスレッドだけが構造体 (Mutex) にアクセスできるようにするには、プロセス間ロックが必要です。

于 2012-10-02T21:55:18.313 に答える
0

次の 2 つのいずれかを行うことができます。1) ミューテックスを作成し、ミューテックス関数を介してロックします (MSDN リファレンスを参照) 2) ロックのブール値 true を作成または利用します (つまり、コピー、変更、または使用ロック解除の場合は false (親スレッドまたはマスター スレッドが処理中)。そうすれば、次のことができます。

int someThread1(threadData *data)
{
    data->lock = true;
    /* Do data functions */
    data->lock = false;
    return 1; //Or whatever you want it to return after checking data
}
int someThread2(threadData *data)
{
    data->lock = true;
    /* Do data functions */
    data->lock = false;
    return 1; //Or whatever you want it to return after checking data
}
void *masterThread(void *data)
{
   ThreadData * t_Data = (ThreadData*)data;
   do
  {
     if(t_Data->lock == false)
     {
       /*Do normal operations */
     }
     else
    {
      Sleep(10); //Give the CPU a break
     //Do whatever else you need
    }
  }while(someCondition == true);
return 0;
}

上記が標準的でも完璧でもないことは承知しています。ただし、ミューテックスを使用していない場合は、スレッドを手動で管理する方法にすぎません。単なるアイデア/提案

于 2012-10-02T22:11:36.413 に答える