3

wait()のメソッドは、単純ではなくオブジェクトをパラメーターとしてboost::conditiona_variable必要とするのはなぜですか?boost::unique_lockboost::mutex

実際のところ、unique_lock の目的はまったく明確ではありません。の周りに別のラッパー オブジェクトを作成する必要があるのはなぜboost::mutexですか? また、パフォーマンスにどのような影響がありますか?

たとえば、2 つのスレッドがあるthread1としthread2ます。

の上thread1

void process() {
  while(true){
    while (objectToProcess == NULL) {
      boost::unique_lock lock(mutex);
      waitingVariable.wait(lock);
    }

    doSomething(objToProcess);

    objToProcess = NULL;
    waitingVariable.notify();
  }
}

オンthread2:

void feedProcessor() {
  while(true) {
        while (objectToProcess != NULL) {
          boost::unique_lock lock(mutex);
          waitingVariable.wait(lock);
        }

        objToProcess = createNewObjectToProcess();
        waitingVariable.notify();
  }
}

この場合、条件変数unique_lockのメソッドを呼び出す必要があるたびに新しいオブジェクトを作成するのは無駄だと思います。wait()そのようなオブジェクトの目的と、それらが大きなオーバーヘッドをもたらすかどうかについて教えてください。

ありがとう!

(私の質問はこの質問と重複しているようですが、私の懸念は目的よりもオーバーヘッドです...)

4

2 に答える 2

1

ミューテックスの代わりに std::unique_lock を渡すことで、既にロックされているミューテックスを与える待機関数の要件を満たすことが保証されます。ミューテックスを渡すことができる場合は、ロックされていないインスタンスを渡すことができるため、待機関数が失敗する必要があります。つまり、何らかの方法でエラーを処理するか、未定義の動作が発生するため、良いことではありません。

最適化されたビルドでは、ミューテックスを手動でロックするよりも追加オブジェクトを使用するオーバーヘッドはおそらくありません (そして、必要に応じて適切にロック解除することを忘れないでください)。

于 2014-01-21T12:14:22.800 に答える