C++
परमाणु प्रकार
खोज…
वाक्य - विन्यास
- std :: परमाणु <टी>
- std :: atomic_flag
टिप्पणियों
std::atomic
एक TriviallyCopyable प्रकार के लिए परमाणु उपयोग की अनुमति देता है, यह कार्यान्वयन पर निर्भर है अगर यह परमाणु संचालन के माध्यम से या तालों का उपयोग करके किया जाता है। केवल गारंटीकृत लॉक-फ्री परमाणु प्रकार std::atomic_flag
।
बहु थ्रेडेड एक्सेस
एक परमाणु प्रकार का उपयोग सुरक्षित रूप से पढ़ने और लिखने के लिए किया जा सकता है, जिसे दो थ्रेड्स के बीच साझा की गई मेमोरी लोकेशन पर लिखा जा सकता है।
खराब उदाहरण जो डेटा रेस पैदा करने की संभावना है:
#include <thread>
#include <iostream>
//function will add all values including and between 'a' and 'b' to 'result'
void add(int a, int b, int * result) {
for (int i = a; i <= b; i++) {
*result += i;
}
}
int main() {
//a primitive data type has no thread safety
int shared = 0;
//create a thread that may run parallel to the 'main' thread
//the thread will run the function 'add' defined above with paramters a = 1, b = 100, result = &shared
//analogous to 'add(1,100, &shared);'
std::thread addingThread(add, 1, 100, &shared);
//attempt to print the value of 'shared' to console
//main will keep repeating this until the addingThread becomes joinable
while (!addingThread.joinable()) {
//this may cause undefined behavior or print a corrupted value
//if the addingThread tries to write to 'shared' while the main thread is reading it
std::cout << shared << std::endl;
}
//rejoin the thread at the end of execution for cleaning purposes
addingThread.join();
return 0;
}
उपरोक्त उदाहरण से एक दूषित रीड हो सकता है और अपरिभाषित व्यवहार हो सकता है।
धागा सुरक्षा के साथ एक उदाहरण:
#include <atomic>
#include <thread>
#include <iostream>
//function will add all values including and between 'a' and 'b' to 'result'
void add(int a, int b, std::atomic<int> * result) {
for (int i = a; i <= b; i++) {
//atomically add 'i' to result
result->fetch_add(i);
}
}
int main() {
//atomic template used to store non-atomic objects
std::atomic<int> shared = 0;
//create a thread that may run parallel to the 'main' thread
//the thread will run the function 'add' defined above with paramters a = 1, b = 100, result = &shared
//analogous to 'add(1,100, &shared);'
std::thread addingThread(add, 1, 10000, &shared);
//print the value of 'shared' to console
//main will keep repeating this until the addingThread becomes joinable
while (!addingThread.joinable()) {
//safe way to read the value of shared atomically for thread safe read
std::cout << shared.load() << std::endl;
}
//rejoin the thread at the end of execution for cleaning purposes
addingThread.join();
return 0;
}
उपरोक्त उदाहरण सुरक्षित है क्योंकि atomic
डेटा प्रकार के सभी store()
और load()
ऑपरेशन एक साथ पहुंच से एन्कैप्सुलेटेड int
रक्षा करते हैं।
Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow