2014-06-16 6 views
5

OpenMP मानक (< = 4.0) atomic के बारे में कहते हैं:एक संदर्भ प्रकार पर ओपनएमपी परमाणु?

#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt

जहां expression-stmt निम्नलिखित रूपों में से एक के साथ एक अभिव्यक्ति कथन है:
...
हैं खंड अद्यतन है या मौजूद नहीं है:
x++;
...
पूर्ववर्ती भाव में:
x और v (जो लागू हो) दोनों अदिश प्रकार के साथ एल-मूल्य अभिव्यक्तियां हैं। है एक अदिश this post के अनुसार, एक संदर्भ (यहाँ int& reference) नहीं:
...

तो, जब मैं इस सही ढंग से व्याख्या, निम्नलिखित लघु कोड स्निपेट अवैध है:

int main() 
{ 
    int myCounter = 0; 
    int& reference = myCounter; 

    #pragma omp parallel for 
    for (int i = 0; i < 100; ++i) 
    { 
    #pragma omp atomic 
    reference++; // Increment through reference. 
    } 
    return 0; 
} 

कारण प्रकार। लेकिन मानक स्पष्ट रूप से बताता है कि atomic का उपयोग करने के लिए यह एक होना चाहिए।

कोड किसी भी चेतावनी के बिना g ++ के साथ संकलित करता है (-Wall -Wextra)।

मेरा प्रश्न है: क्या मैंने मानक, या सी ++ के "संदर्भ प्रकार" की अवधारणा को गलत समझा है? या अधिकांश संकलक इस कोड को संकलित करते हैं, क्योंकि अन्यथा atomic का उपयोग गंभीर रूप से सीमित है (मूल रूप से ढेर पर कोई डेटा atomic का लक्ष्य नहीं हो सकता है, क्योंकि आपको हमेशा संदर्भ या एक संदर्भित सूचक की आवश्यकता होती है)?

उत्तर

5

एक संदर्भ प्रकार स्केलर प्रकार नहीं है। हालांकि, इस तथ्य पर आपके प्रश्न पर कोई असर नहीं है। महत्वपूर्ण तथ्य यह है कि एक अभिव्यक्ति जो स्केलर प्रकार के संदर्भ का मूल्यांकन करती है स्केलर प्रकार के साथ एक लवली है। विशिष्ट होना करने के लिए, चरreference टाइप int& है, लेकिन अभिव्यक्तिreference टाइप int और मूल्य वर्ग lvalue है। तो हाँ, आपका कार्यक्रम अनुरूप है।

+0

स्पष्टीकरण के लिए बहुत धन्यवाद :) – Gugi

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