1

StackOverflow のユーザーの皆様、こんにちは。

私は C++ で Win32 API から MapViewOfFile を操作してきましたが、初心者ですが、mapview ファイルのセマフォを作成しようとしていました。すでにコピーされており、メイン インスタンスがそれを読み取っています。



私が思いついたのは、それを行うためのさまざまな方法を作成することでしたが、それを行うための最良の方法を知る必要があります.

1) while ループを使用して mapviewfile が空になるのを待ちます。
私は次のことをしようとしました:

mapViewFile = (LPTSTR) MapViewOfFile(mapView,
FILE_MAP_ALL_ACCESS,0,0,SH_MAX_MEMORY);

if(mapViewFile!=NULL){

// Wait for the mapviewfile to be empty.
while(mapViewFile!=""); // This while is only for delay the operation and wait for the mapviewfile it's empty, we don't need any action in this while.
CopyMemory((PVOID)mapViewFile,defaultalloc,(_tcslen(defaultalloc) * sizeof(TCHAR)));
UnmapViewOfFile(mapViewFile);
}

CloseHandle(mapView);

そのため、mapviewfile が空の場合、while はスキップされ、「セカンダリ」インスタンスがそれにコピーされ、メイン インスタンスがそれを読み取って mapviewfile を空にすると、セマフォが生成されます。

2)ミューテックス
の使用 もう 1 つの方法は、Win32 Api のミューテックスを使用するCreateMutex
ことです。


だから、私の質問は次のとおりです。

  1. 自分のやりたいことをやるには、どの方法が一番いいですか?(第1段落で説明)
  2. mapviewfile はこれを行うのに問題はありませんか? (2 つ以上のインスタンスをメイン インスタンスと通信したいことを思い出してください)。

それらは質問です、ありがとう。

4

1 に答える 1

1

共有リソースへのアクセスを同期しようとしています。その方法は、同期オブジェクトを使用することです。これは、ミューテックスを使用することを意味します。

ミューテックスを使用するということは、ビジー ループではなくアイドル待機を実行できることを意味します。また、コンパイラがループmapViewFile内の読み取りを最適化することを心配する必要もありません。whileまた、複数のプロセスが書き込みを行っている場合は、ミューテックスまたは同等のものなしでは解決できないデータ競合が発生します。最初のオプションは、そのシナリオでは機能しません。

strcmpちなみに、whileループテストで使用する必要があります。これは、mapViewFile!=""常に true と評価されるためです。

于 2013-04-13T15:31:29.620 に答える