2013-07-07 36 views
13

क्या ऑब्जेक्ट का उपयोग std::sregex_iterator, std::regex_match आदि का उपयोग कर कई धागे में करना संभव है?समवर्ती रूप से std :: regex, परिभाषित व्यवहार का उपयोग कर?

उदाहरण के लिए, निम्न उत्पादन तार्किक व्यवहार होगा:

bool SomeFunc(const std::string& szString1, const std::string& szString2) 
{ 
    static const std::regex regexTest("=== ([\\w]+) ===", std::regex_constants::optimize); 

    std::future<bool> f = std::async([](std::string szString) { 
     return std::regex_match(szString, regexTest); 
    }, szString1); 

    bool b = std::regex_match(szString2, regexTest); 

    return (b && f.get()); 
} 

मैं कुछ भी है जिसमें कहा गया है कि क्या एक const std::regex का उपयोग कर समवर्ती अपरिभाषित व्यवहार में है या नहीं परिणाम नहीं मिल रहा। जहां तक ​​मैं कह सकता हूं, रेगेक्स ऑब्जेक्ट में कोई संपादन नहीं किया जा रहा है, इसलिए इसे अनिश्चित रूप से उपयोग करके कोई अपरिभाषित व्यवहार प्रेरित नहीं किया जाना चाहिए?

अग्रिम धन्यवाद!

उत्तर

19

हां, const std::regex थ्रेड-सुरक्षित है। असल में मानक पुस्तकालय में कोई भी कॉन्स्ट विधि थ्रेड-सुरक्षित है, देखें:

§17.6.5.9/3। एक सी ++ मानक लाइब्रेरी फ़ंक्शन सीधे या अप्रत्यक्ष रूप से वर्तमान धागे के अलावा थ्रेड द्वारा सुलभ वस्तुओं (1.10) को संशोधित नहीं करेगा जब तक कि ऑब्जेक्ट को सीधे या अप्रत्यक्ष रूप से तक फ़ंक्शन के गैर-कॉन्स्ट तर्कों के माध्यम से एक्सेस किया जाता है।

+0

धन्यवाद, मैंने यही पाया; मैं सिर्फ पुष्टि चाहता था। –

+0

@ronag क्या आप अपने उत्तर में समझा सकते हैं कि उन्होंने इस विनिर्देश के लिए क्यों चुना? यह कक्षा के साथ कैसे हासिल किया जाता है जो सी ++ मानक पुस्तकालय का हिस्सा नहीं है? मुझे आशा है कि आपको उन सवालों के जवाब देने का समय मिलेगा! :) – Tim

+0

@ टिम "_ यह भी एक वर्ग के साथ कैसे प्राप्त किया जाता है जो सी ++ मानक पुस्तकालय का हिस्सा नहीं है? _" मैं आपके प्रश्न को समझ नहीं पा रहा हूं ... – curiousguy

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