5

次のシナリオを検討してください。

  • boost::asio独自のスレッドでそれぞれを介した2つの異なるネットワークポート
  • 1つのポートがデータを受信して​​処理class DataConnectionしています-std::thread
  • 1つのポートは、統計を送信するためのものclass StatConnectionであり、std::thread

接続(およびその他の小さなデータ)をカウントするための私のアイデアは、次のようなstatic変数を使用することでした。namespace

#include <atomic>

namespace app {
 namespace status {
   static std::atomic<long> counter = 0; 
 }
}

これはDataConnectionクラスでは問題なく機能します。ここでcounterは、c'torをインクリメントして、値の増分を確認します。

しかしcounter、私のStatConnectionクラスでは常に0

なぜこれが起こるのでしょうか?

私はいくつかの選択肢を試しました:

  • 交換:違いはありませんでしたstd::atomic<long>static volatile long
  • staticキーワードなしで名前空間を使用します。

次に、リンカーエラーが発生しました。

multiple definition of `app::status::searchtime'
./src/status/Status.o:/[...]/include/status/Status.hpp:16: first defined here
[...]

では、なぜcountスレッド間で値が異なるのでしょうか。

4

1 に答える 1

10

staticcounter名前空間スコープでは内部リンケージが導入されるため、各変換ユニットには、実際に必要なものとはまったく逆の独自のコピーがあります。

extern代わりに、ヘッダーで使用してください。

//foo.h:
#include <atomic>

namespace app {
    namespace status {
        extern std::atomic<long> counter;
    }
}

次に、 1つの変換単位で変数を定義します。

//foo.cpp:
#include "foo.h"

namespace app {
    namespace status {
        std::atomic<long> counter{0L};
    }
}
于 2012-06-26T23:50:25.103 に答える