2012-06-26 19 views
5

निम्नलिखित szenario पर विचार करें:वैश्विक चर - मान धागे में मतभेद है

  • 2 अलग boost::asio प्रत्येक के माध्यम से अपने सूत्र में
  • 1 बंदरगाह प्राप्त कर रहा है नेटवर्क बंदरगाहों और डाटा प्रोसेसिंग - class DataConnection एक में लिपटे std::thread
  • 1 बंदरगाह के आंकड़े भेजना भी एक std::thread

के लिए में लिपटे class StatConnection के लिए है

#include <atomic> 

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

यह DataConnection वर्ग के लिए ठीक काम करता है: गिनती कनेक्शन (और अन्य छोटे डेटा टुकड़े) मेरा विचार की तरह एक namespace अंदर एक static चर का उपयोग करने के लिए किया गया था। यहां मैं c'tor में counter बढ़ाता हूं और मूल्य वृद्धि देखता हूं।

लेकिन counter मेरी StatConnection कक्षा में 0

ऐसा क्यों हो सकता है हमेशा होता है?

  • static volatile long के लिए std::atomic<long> का आदान प्रदान: एक अंतर नहीं बना था

    मैं कुछ विकल्प की कोशिश की है।

  • static कीवर्ड के बिना नामस्थान का उपयोग कर।

तब मैं लिंकर त्रुटियों मिला:

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

तो क्यों count धागे के बीच अलग अलग का मूल्य है?

+0

हुह? नेमस्पेस का स्टेटिक सदस्य? क्लास के स्थिर सदस्य क्यों नहीं? – Griwes

+0

कक्षा केवल थोड़े समय के लिए मौजूद है और बूस्ट :: एएसओ से संबंधित कक्षाएं std :: thread के माध्यम से एन-बार शुरू की जाती हैं। तो मैंने सोचा कि इसे नामस्थान में डालने से यह अलग हो जाता है। लेकिन एक स्थिर सदस्य समस्या को हल कर सकता है जिसे मैं देखता हूं। मुझे अभी भी यकीन नहीं है कि नामस्थान दृष्टिकोण क्यों काम नहीं करता है। –

उत्तर

9

static नाम स्थान दायरे में आंतरिक संबंध का परिचय है, इसलिए प्रत्येक अनुवाद इकाई counter – काफी क्या आप वास्तव में चाहते हैं के विपरीत की अपनी एक प्रतिलिपि होगा!

उपयोग extern बजाय, शीर्षक में:

//foo.h: 
#include <atomic> 

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

तब में एक अनुवाद इकाई वैरिएबल निर्धारित:

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

namespace app { 
    namespace status { 
     std::atomic<long> counter{0L}; 
    } 
} 
+1

इसे 'std :: atomic ' के साथ काम करने के लिए 'मुझे foo.cpp' में लिखना था: 'std :: atomic काउंटर (0);' –

+0

@emteh: आह, मुझे नहीं पता था कि निर्माता स्पष्ट था या नहीं। मैं संपादित करूंगा, धन्यवाद। – ildjarn

संबंधित मुद्दे