1

並行プログラミングの理論を 1 学期ずっと勉強した後、学んだことを実践に移したいと思いました。モニターは、データ構造体、関数、および条件変数を収集するオブジェクト (クラスのインスタンス) であることを知っています。C++ では、これらすべてをスレッドで実行できることがわかりました。代わりに、プロセス間でモニター (条件、データ構造体...) を共有したい場合はどうすればよいですか? fork() で作成された可能性があります...たとえば、プロデューサーとコンシューマーです。プロセス間で条件変数を共有するブースト ライブラリがあるのを見たことがありますが、これは正しいですか?

4

3 に答える 3

1

プロセス間通信は通常、OS セマフォと共有メモリを介して行われます。これらのリソースを割り当てて管理するためのフレームワークは、OS に大きく依存します。

幸いなことに、Boost C++ ライブラリには、これを実行できる OS に依存しない抽象化が既に用意されています

于 2013-02-04T21:13:18.690 に答える
1

いくつかの選択肢があります。主要な検索エンジンのプロセス間通信を参照してください。オブジェクトとフラグを共有したい場合は、2 つのプロセスが緊密に連携しているように思えます。この場合、スレッドの方が適しています。

于 2013-02-04T20:53:41.177 に答える
1

1 つのアプローチは、問題を 3 つ以上の部分に分割することです。

モニター上のメソッドの抽象インターフェイス。オブジェクトがプロセス間であることが想定されている場合は、内部で IPC を実装するか、メソッドの同一のコードを持つ各プロセスに依存することができます。

データは 1 つの場所に保存する (そして全員が IPC を使用してその 1 つの場所と通信する) か、各プロセスに保存して同期を保つことができます。データの共有メモリは、データの IPC の 1 つのソリューションであることに注意してください (これにより、コードを各プロセスでローカルに実行できます)。

3 番目の部分は同期です。これは、「共通オブジェクト」とはまったく異なる問題として扱うことができ、ほとんどの場合、それを機能させる方法と直交して解決されます。

これを行う 1 つの方法は、次のような、任意のデータへのアクセスを同期するテンプレートを作成することです。

template<typename T, typename MyMutex=std::mutex, typename MyLock=std::unique_lock>
struct Synced {
  mutable MyMutex mutex;
  T* t;
  Synced( T& t_ ):t(&t_), mutex() {}
  Synced( T& t_, MyMutex&& m ):t(&t_), mutex(std::move(m)) {}
  template<typename Functor>
  auto operator()( Functor&& f )->decltype( f(declval<T>()) ) const {
    MyLock _(mutex);
    return f(*t);
  }
};

これは、任意の型 T の同期ラッパーの例です。

Synced<std::ostream> synced_cout(std::cout);
void test() {
  synced_cout([&](std::ostream& os) {
    os << "Hello world!\n";
  });
}

ここで、一般的な方法で へのアクセスを同期しostreamました。

(上記の多くは、Bjarne Stroustrup または Herb Stutter のいずれかから露骨に盗んだものであり、エラーはすべて私自身のものです)。

于 2013-02-04T22:31:26.290 に答える