में मैं सी ++ कार्यों का एक सेट है। क्या इसे प्राप्त करने का कोई तरीका है?परमाणु संचालन सी ++
उत्तर
सामान्य रूप से, नहीं। परमाणु संचालन बहुत सटीक परिभाषित हैं। आप जो चाहते हैं वह एक सैमफोर या म्यूटेक्स है।
कृपया ध्यान दें कि यह उत्तर कड़ाई से सही बोल रहा है, रोब का उत्तर उपयोगकर्ता 744829 के लिए अधिक उपयोगी है। – Joshua
एक तरीका यह है कि आप इसे पूरा कर सकते हैं नई (सी ++ 11) विशेषताएं std::mutex
और std::lock_guard
का उपयोग करना है।
प्रत्येक संरक्षित संसाधन के लिए, आप एक वैश्विक std::mutex
को तुरंत चालू करते हैं; प्रत्येक थ्रेड तो, कि म्युटेक्स ताले के रूप में यह आवश्यकता है, एक std::lock_guard
के निर्माण से:
#include <thread>
#include <iostream>
#include <mutex>
#include <vector>
// A single mutex, shared by all threads. It is initialized
// into the "unlocked" state
std::mutex m;
void funcB() {
std::cout << "Hello ";
}
void funcC() {
std::cout << "World." << std::endl;
}
void funcA(int i) {
// The creation of lock_guard locks the mutex
// for the lifetime of the lock_guard
std::lock_guard<std::mutex> l(m);
// Now only a single thread can run this code
std::cout << i << ": ";
funcB();
funcC();
// As we exit this scope, the lock_guard is destroyed,
// the mutex is unlocked, and another thread is allowed to run
}
int main() {
std::vector<std::thread> vt;
// Create and launch a bunch of threads
for(int i =0; i < 10; i++)
vt.push_back(std::thread(funcA, i));
// Wait for all of them to complete
for(auto& t : vt)
t.join();
}
नोट्स:
- अपने उदाहरण में कुछ कोड
funcA
से संबंधित नहीं आह्वान सकता या तोfuncB
याfuncC
का सम्मान के बिनाfuncA
सेट लॉक करें। - आपके प्रोग्राम की संरचना के आधार पर, आप म्यूटेक्स के जीवनकाल को अलग-अलग प्रबंधित करना चाह सकते हैं। उदाहरण के तौर पर, यह कक्षा के वर्ग सदस्य बनना चाह सकता है जिसमें
funcA
शामिल है।
आप जीसीसी 4.7 उपयोग कर रहे हैं की तुलना में आप निम्न कार्य करना नई व्यवहार स्मृति सुविधा का उपयोग कर सकते हैं:
लेन-देन की स्मृति डेटा साझा करने के लिए विशेष रूप से सिंक्रनाइज़ करना पहुँच में, सूत्र सरल के साथ प्रोग्रामिंग बनाने के लिए करना है लेनदेन का उपयोग कर कई धागे के बीच। डेटाबेस के साथ, एक लेनदेन काम की एक इकाई है जो या तो पूरी तरह से पूर्ण हो जाती है या इसका कोई प्रभाव नहीं पड़ता है (यानी लेनदेन परमाणु रूप से निष्पादित होता है)। इसके अलावा, लेनदेन एक-दूसरे से अलग होते हैं जैसे कि प्रत्येक लेनदेन स्मृति के निरंतर दृश्य को देखता है।
वर्तमान में, लेन-देन केवल लेनदेन विवरण, लेनदेन अभिव्यक्तियों और फ़ंक्शन लेनदेन के रूप में सी ++ और सी में समर्थित हैं। निम्न उदाहरण में, दोनों ए और बी पढ़ा जाएगा और अंतर ग लिखा जाएगा, सभी atomically और अन्य लेनदेन से अलग:
__transaction_atomic { c = a - b; }
इसलिए, एक और धागा समवर्ती बिना ख अद्यतन करने के लिए निम्नलिखित कोड का उपयोग कर सकते कभी के कारण ग एक नकारात्मक मूल्य धारण करने के लिए (और इस तरह ताले या सी ++ 11 एटोमिक्स के रूप में अन्य तुल्यकालन निर्माणों का उपयोग किए बिना):
__transaction_atomic { if (a > b) b++; }
लेन-देन की सटीक अर्थ विज्ञान सी ++ 11 के रूप में परिभाषित कर रहे हैं/सी 1 एक्स मेमोरी मॉडल (विनिर्देश के लिंक के लिए नीचे देखें)। असल में, लेन-देन सिंक्रनाइज़ेशन गारंटी प्रदान करते हैं जो सभी लेनदेन के लिए एक गार्ड के रूप में एक वैश्विक लॉक का उपयोग करते समय गारंटीकृत की जाएगी। ध्यान दें कि सी/सी ++ में अन्य सिंक्रनाइज़ेशन संरचनाओं की तरह, लेन-देन डेटा-रेस-फ्री प्रोग्राम पर भरोसा करते हैं (उदाहरण के लिए, एक नॉनट्रांसैक्शनल लिखना जो एक ही स्मृति स्थान पर एक लेनदेन पढ़ने के साथ समवर्ती है, एक डेटा रेस है)।
और जानकारी: http://gcc.gnu.org/wiki/TransactionalMemory
- 1. क्या संचालन परमाणु संचालन
- 2. यूनिक्स पोर्टेबल परमाणु संचालन
- 3. Django में परमाणु संचालन?
- 4. लॉक-फ्री संरचनाओं के लिए सी ++ परमाणु संचालन
- 5. MySQL परमाणु संचालन और तालिका लॉकिंग
- 6. परमाणु फ़ाइल लेखन संचालन (क्रॉस प्लेटफ़ॉर्म)
- 7. जीसीसी परमाणु संचालन से निर्मित लाइटवेट स्पिनलॉक्स?
- 8. जावास्क्रिप्ट में परमाणु संचालन (Concurrency मॉडल) कैसे प्राप्त करें?
- 9. परमाणु संचालन प्रतिस्पर्धा कर सकते हैं एक दूसरे को भूखा?
- 10. कई लेनदेन रहित बाहरी प्रणालियों पर परमाणु संचालन
- 11. नेस्टेड चुनिंदा परमाणु संचालन के साथ अद्यतन है?
- 12. जीसीसी के नए परमाणु पूर्णांक संचालन के विकल्प
- 13. सी preprocessors और संचालन
- 14. कुडा में परमाणु संचालन? कौन सी हेडर फ़ाइल शामिल करने के लिए?
- 15. सी ++ सरल संचालन (+, -, /, *) मूल्यांकन वर्ग
- 16. सी ++ ऑपरेटर जटिल संख्या संचालन
- 17. सी # बहु-क्रम सूची संचालन
- 18. सी # मूल बातें बनाना परमाणु
- 19. सी ++, सी ++ 11, std :: परमाणु सदस्य कार्य
- 20. संचालन
- 21. कंपोजेबल परमाणु-जैसे ऑपरेशंस
- 22. 86 128 बिट परमाणु ऑप्स
- 23. परमाणु Long.lazySet
- 24. क्या लिखें परमाणु परमाणु है?
- 25. परमाणु इंटेगरएरे बनाम परमाणु इंटेगर []
- 26. CUDA परमाणु परिचालनों की सूची
- 27. सी ++ 11 इंटरप्रोसेस परमाणु और म्यूटेक्स
- 28. सी ++ में पॉइंटर असाइनमेंट परमाणु है?
- 29. विजुअल सी ++ 2010 परमाणु प्रकार का समर्थन?
- 30. CSG संचालन
आप विस्तार से बता सकते हैं आप "atomically निष्पादित" क्या मतलब है? ऐसा लगता है कि आप बस 'std :: mutex' चाहते हैं। – Potatoswatter
शायद यही वह वास्तव में चाहता है। – Joshua
शायद किसी को उसे 'std :: mutex' का उपयोग करने के लिए उचित वाक्यविन्यास दिखाना चाहिए। शायद वह नहीं जानता है। मैं नहीं जानता कि कुछ अन्य भाषाओं में म्यूटेक्स का उपयोग कैसे करें। स्पष्टीकरण में शायद यह धारणा शामिल होनी चाहिए कि पूरे कार्यक्रम को म्यूटेक्स का सम्मान करना है। अर्थात। थ्रेड बी अभी भी funcb और funcC को कॉल कर सकता है भले ही थ्रेड ए म्यूटेक्स के तहत ऐसा करता है, जब तक कि प्रोग्रामर इसे डिज़ाइन के माध्यम से प्रतिबंधित न करे। –