0

データ構造を作成し、それを継続的に使用するプログラム(Xと仮定)をc ++で作成しました。ここで、前のプログラムを中止せずにそのデータ構造を変更したいと考えています。このタスクを達成するために2つの方法を試しました:

  1. 同じプログラム X で、最初にデータ構造を作成し、次に何らかの目的でそのデータ構造にアクセスして使用する子プロセスを作成しようとしました。親プロセスは実行を続行し、挿入、削除などの変更をユーザーに要求し、コンソールから入力を受け取り、その後変更が行われます。ここでの問題は、子プロセスが使用していたデータ構造のコピーを変更しないことです。後で、子プロセスがデータ構造の独自のコピーを使用しているため、親プロセスを介して行われた変更が反映されないため、これは役に立たないことがわかりました。しかし、間違いなく、私はこれが起こることを望んでいませんでした. だから私はマルチスレッドに行きました。

  2. 子プロセスを作成する代わりに、そのデータ構造にアクセスして使用する別のスレッドを作成し、別のスレッドでコンソールからユーザー入力を取得しようとしました。スレッド間の切り替えが非常に高速であるため、これも機能しませんでした。

ですから、この問題を解決するのを手伝ってください。変更を元のデータ構造に反映させたい。また、時間が重要であるため、プロセス (アクセスして継続的に使用しているプロセス) を時々待機させたくありません。

4

2 に答える 2

0

最初のポイント:これは些細な問題ではありません。それをうまく処理するには、1つか2つの簡単なハックだけでなく、システムを設計する必要があります。

まず、動的な変更をサポートするには、DLLや.soなどのコードでデータ構造を定義して、動的にロードできるようにする必要があります。

続行する方法の一部は、厳密にメモリに保存されているデータについて話しているのか、それともファイル指向であるのかによって異なります。後者の場合、決定の一部は、データ構造の新しい形式が古い形式よりも大きいかどうか(つまり、その場でアップグレードできるかどうか)に少し依存します。

単純なものから始めて、メモリ内の構造体のみを扱っていると仮定しましょう。各データ項目はオブジェクトとして表されます。データにアクセスするために必要なものに加えて、各オブジェクトはロックを提供し、以前のバージョンのオブジェクトのオブジェクトからそれ自体を構築する方法を提供します(つまり、ctorだけでなくオンデマンドで)。

新しいオブジェクトタイプを定義するDLL/.soをロードすると、既存のオブジェクトの現在のコレクションと同じサイズのコレクションが作成されます。新しいオブジェクトはそれぞれ「レイジー」状態になり、初期化されますが、実際にはまだ古いオブジェクトから作成されていません。

次に、新しいコレクションをプログラムの残りの部分に認識させるスレッドを開始し、新しいオブジェクトのコレクションをウォークスルーし、古いオブジェクトをロックし、それを使用して新しいオブジェクトを作成し、古いオブジェクトを破棄します。古いコレクションから削除します。古いオブジェクトをロックしようとすると、かなり短いタイムアウトが使用されます(つまり、オブジェクトが使用されている場合、オブジェクトはそれほど長く待機せず、次のオブジェクトに進むだけです。すべてが完了するまで繰り返し繰り返されます。古いオブジェクトが更新され、古いオブジェクトのコレクションが空になっています。

ディスク上のデータの場合、オブジェクトのコレクションがディスク上のデータへのアクセスを提供することを除いて、状況ほぼ同じです。2つの別々のファイルを作成し、必要に応じて変換しながら、一方から他方にデータをコピーします。

別の可能性(特にデータをその場でアップグレードできる場合)は、単一のファイルを使用することですが、各レコードにバージョン番号を埋め込みます。いくつかの生データを読み取り、バージョン番号を確認し、適切なコードを使用して読み取り/書き込みを行います。古いバージョン番号を読み取っている場合は、古いコードで読み取り、新しい形式に変換して、新しい形式で書き込みます。更新するスペースがない場合は、ファイルの最後に新しいレコードを書き込み、インデックスを更新して新しい位置を示します。

于 2012-05-16T20:27:15.000 に答える
0

同時アクセスへのアプローチは、目隠しをした幼児でいっぱいの教室でケーキを分け合うようなものです。ねばねばした混乱になってしまうのは当然のことです。各幼児は、順番を待って掘り下げるか、自分だけがケーキのどの部分に触れることができるかを正確に知る必要があります。

コードに変換すると、前者はデータ構造へのアクセスを制御するロックまたはミューテックスを持つことを意味し、いつでも 1 つのスレッドのみがデータ構造を変更できるようにします。

後者は、データ構造のどの部分を更新できるかをそれぞれが正確に知っているスレッドによってその場で変更されるデータ構造を持つことによって行うことができます。たとえば、更新する範囲の詳細を含む構造体を渡し、事前にデータを効果的に分割する. これらはオーバーラップしてはならず、イテレータを (サイズ変更などによって) 無効にしないでください。これは、特定の問題では不可能な場合があります。

リソースの競合を処理するためのアルゴリズムは多数あるため、これは大幅に単純化されています。分散コンピューティングは、この種の問題に特化したコンピューター サイエンスの重要な分野です。問題を研究し(詳細は提供しませんでした)、魔法を期待しないでください。

于 2012-05-16T22:27:53.247 に答える