2012-06-26 23 views
5

で異なる次szenario検討:boost::asioを介して自身のスレッドで グローバル変数 - 値がスレッド

  • 1ポートがデータを受信して​​処理している

    • 2つの異なるネットワークポートを - に包まclass DataConnectionstd::thread
    • 1ポートはまたのためにstd::thread

    に包まれた統計class StatConnectionを送信するためであります

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

    これはDataConnectionクラスのために正常に動作します:接続(および他の小さなデータの断片)をカウント私の考えは次のようにnamespacestatic変数を使用することでした。ここで私は012'をc'torに増やし、値の増分を見る。私StatConnectionクラスで

    しかしcounterは常に0

    あるなぜこれが起こることができますか?​​ためstd::atomic<long>を交換

    • :違いを行っていませんでした

      は、私はいくつかの選択肢を試してみました。

    • staticキーワードなしの名前空間を使用しています。

    それから私は、リンカエラーを得た:

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

    なぜスレッド間の異なるcountの値がありますか?

  • +0

    ホ:

    //foo.h: #include <atomic> namespace app { namespace status { extern std::atomic<long> counter; } } 

    そして1つの変換単位で変数を定義?名前空間の静的メンバーですか?クラスの静的メンバーだけではないのはなぜですか? – Griwes

    +0

    クラスは短時間しか存在せず、boost :: asio関連のクラスはstd :: thread経由でn回起動されます。だから私はそれを名前空間に入れることがこのことを別にしていると思った。しかし、静的なメンバーが私がそれを調べる問題を解決する可能性があります。名前空間のアプローチがうまくいかなかった理由はまだ分かりません。 –

    答えて

    9

    static名前空間のスコープ内には、それぞれの翻訳単位にcounter –という独自のコピーがあります。

    使用extern代わりに、ヘッダに:

    //foo.cpp: 
    #include "foo.h" 
    
    namespace app { 
        namespace status { 
         std::atomic<long> counter{0L}; 
        } 
    } 
    
    +1

    'std :: atomic ' 'foo.cpp'で書く必要がありました:' std :: atomic counter(0); ' –

    +0

    @emteh:ああ、コンストラクタ明白かどうか私は編集します、ありがとう。 – ildjarn

    関連する問題