3

私は VS2010 で C++ を使用しており、多数のプロパティ (getter と setter) (実際にはプロパティを持つ一連のオブジェクト) を持つコンテナー クラスがありますが、単純化して、コンテナー クラスの直接のプロパティであると仮定します。

このコンテナー クラスには Update 関数があり、Update メソッドの実行中はセッター メソッドがブロックされることが重要です。

アプリはマルチスレッドなので、これを処理するためにミューテックス/イベント/クリティカル セクションを使用することを考えていました。

私の質問は、セッターメソッドが互いにブロックすることなく、Update メソッドが動作している間にセッターをロック/ブロックするにはどうすればよいですか? さらに、Update メソッドをブロックするセッターも必要です。

つまり、セッターが互いにブロックしないことを除いて、通常のクリティカル セクション メカニズムが必要です。

前もってありがとう、マーティン

4

3 に答える 3

3

セッター (例: setPropertyX(value)) を同時に保護する必要がない場合、これは単一のセマフォと手動でリセット可能なイベントで実行できます。ここで、最初のリソース数は、保護しているプロパティの数です。

任意のセッターで:

  • 設定どおりに NoUpdatePendingEvent を待機します。
  • セマフォ資源の獲得 (1)
  • プロパティ値の更新
  • セマフォ資源解放 (1)

メイン更新ルーチンで

  • NoUpdatePending イベントのクリア
  • セマフォ資源の獲得 (n)
  • アップデートする
  • セマフォ資源の解放 (n)
  • NoUpdatePending イベント セット

ここで、(n) は所有しているプロパティの数です。NoUpdatePending の初期状態が設定されており、それを待ってもリセットされません (したがって、手動リセットのみの要件)。プロパティが更新されている限り、更新を入力することはできません。Update コードを入力して NoUpdatePending イベントをクリアするとすぐに、着信 prop-updates はイベントで停止し、セマフォ リソースを消費しません。実行中のすべての prop-set は、更新を続行するために必要なリソースを最終的に解放します。

とはいえ、プロパティの同時実行を個別に検討する必要があります。

于 2012-10-16T07:08:21.710 に答える
2

プロパティごとにクリティカル セクションを設定できます。セッターでは、プロパティ固有のクリティカル セクションを取得して作業を行います。このようにして、各プロパティは互いにブロックしません。

メソッドで、Update更新を行う前にプロパティ固有のクリティカル セクションをすべて取得します。これにより、更新中に誰かがセッターを呼び出すと、セッターがブロックされるようになります。

于 2012-10-16T07:00:17.213 に答える
0

クリティカル セクションと整数のみを使用し、セッターの数を気にしないオプションを次に示します。

各セッターで:

  • クリティカル セクションの csUpdate を取得する
  • InterlockedIncrement(&countSettersActive)
  • クリティカル セクション csUpdate のリリース
  • プロパティの更新
  • InterlockedDecrement(&countSettersActive)

メイン更新ルーチンで:

  • クリティカル セクションの csUpdate を取得する
  • while (InterlockedCompareExchange(&countSettersActive, 0, 0) != 0) { スリープ(1); }
  • 更新する
  • クリティカル セクション csUpdate のリリース
于 2014-12-11T20:53:30.110 に答える