खोज…


वाक्य - विन्यास

  • 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