6

以下の 2 つのコード サンプルは同等ですか?

Poco::ProcessHandle::PID ProcessRunner::processId() const
{
    Poco::ProcessHandle::PID pid = 0;
    mMutex.lock();
    pid = mPID;
    mMutex.unlock();
    return pid;
}

Poco::ProcessHandle::PID ProcessRunner::processId() const
{
    Poco::ScopedLock<Poco::Mutex> lock(mMutex);
    return mPID;
}
  • 2 番目のサンプル: 戻り値のコピーが作成された後、ロックは範囲外になりますか? これは、コピーするための多くの命令を持つオブジェクトが返された場合に問題になります。
  • int 値のみを返す場合、ロックは必要ですか? それとも int のコピーはアトミック操作ですか?
4

2 に答える 2

8

それらは同等です。ローカルは、ブロックの最後の行が実行されるまでスコープ外になりません。したがって、この場合、戻り値のコピーはロックの保護下で作成されます。

于 2009-11-17T20:47:09.780 に答える
3

Poco の ScopedLock が Boost の lock_guard のように機能し、PID 割り当てが例外をスローできない場合、最初の質問に対する答えは「はい」です。この ScopedLock の目的は、デッドロックを防ぐことです。例外がスローされた場合でも、ミューテックスのロックを解除することを忘れることはできません。「一部のデータのみを読み取る」場合でもロックが必要ですか? まあ、この場合 (1 つの int のみにアクセスする) は一種のグレー ゾーン (そうしないほうがよい) ですが、一般に、データを読み取るだけの場合はミューテックスもロックします。

于 2009-11-17T20:45:38.817 に答える