0
Singleton* Singleton::instance() {

if (pInstance == 0) {

    Lock lock;

    if (pInstance == 0) {

        Singleton* temp = new Singleton; // initialize to temp
        pInstance = temp; // assign temp to pInstance
   }
  }

コンパイラが冗長な一時を最適化していないとします。スレッド A が入っており、Singleton オブジェクトを割り当てて構築します。このオブジェクトは temp によってポイントされます。その直後に A がプリエンプトされます。ここで、スレッド B がロックを取得し、ログインして、pInstance が NULL であることを確認します。また、Singleton オブジェクトを作成し、既存のポインターを上書きします。現在、メモリリークが発生していると思われます。あなたの意見は何ですか ?完全なソースはこちら: コード リファレンス: http://erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf

4

2 に答える 2

1

いいえ。A が中断されると、A はロックを所有します。したがって、B は A がロックを解除するまで待たなければなりませんが、その後 pInstance が割り当てられ、B の 2 回目の null のチェックは失敗します。

于 2013-10-11T19:25:14.907 に答える