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