2015-11-17 6 views
6

कुछ लोगों को चेतावनी दे रहे हैं कि ताले का उपयोग गलत है लेखन से हो सकता है:क्या सी ++ में अस्थायी चर को तुरंत चालू करना संभव है?

std::unique_lock<std::mutex>(mutex); 
निम्नलिखित सही कथन के बजाय

:

std::unique_lock<std::mutex> lock(mutex); 

अर्थात एक स्थानीय चर के बजाय एक अज्ञात अस्थायी चर बनाएँ। अस्थायी चर तुरंत नष्ट हो जाएगा और समय से पहले mutex अनलॉक।

उदाहरण gperftools (line 321-324) header के लिए देखें:

// Catch bug where variable name is omitted, e.g. MutexLock (&mu); 
#define MutexLock(x) COMPILE_ASSERT(0, mutex_lock_decl_missing_var_name) 
#define ReaderMutexLock(x) COMPILE_ASSERT(0, rmutex_lock_decl_missing_var_name) 
#define WriterMutexLock(x) COMPILE_ASSERT(0, wmutex_lock_decl_missing_var_name) 

इस मैक्रो फिर से इस तरह के उपयोग के मामलों की रक्षा के लिए लिखा है।

लेकिन क्या यह अभी भी हो सकता है? जाहिरा तौर पर हाल ही में एक पर्याप्त जीसीसी या बजना इस मामले में त्रुटियों का उत्पादन करेगा:

#include <iostream> 

class Mutex {}; 

class Lock { 
public: 
    explicit Lock(Mutex */* dummy */) { std::cout << __PRETTY_FUNCTION__ << std::endl; } 
    ~Lock() { std::cout << __PRETTY_FUNCTION__ << std::endl; } 
}; 

int main() { 
    Mutex mutex; 
    { 
    Lock l(&mutex); 
    } 
    { 
    Lock(&mutex); // This line does not compile. 
    } 
    return 0; 
} 

और त्रुटि:

g++ foo.cpp 
foo.cpp:17:11: error: declaration of reference variable 'mutex' requires an initializer 
    Lock(&mutex); 
      ^~~~~ 
1 error generated. 

किसी एक रेप्रो मामले में जहां इस तरह के एक मैक्रो कोई वास्तविक बग पकड़ प्रदर्शन कर सकता है? मैं अब तक एक साथ नहीं आ सकता था।

+1

संभवतः संबंधित: http://stackoverflow.com/questions/914861/disallowing-creation-of-the - समकालीन वस्तुएं – BenC

उत्तर

4

आप वास्तव में चीजों के लिए असंबद्धता नियम द्वारा सहेजे जा रहे हैं-घोषणा-घोषणाएं (उन्हें घोषणाओं के रूप में पार्स किया गया है, अभिव्यक्ति नहीं), नियम के साथ-साथ संदर्भों को प्रारंभ करने की आवश्यकता होती है।

यह तुम यहाँ नहीं बचा होगा:

std::mutex m; 
int main(){ 
    std::unique_lock<std::mutex>(m); // m is a local default-constructed unique_lock 
} 

या यहाँ:

struct C { Mutex m; } c; 
int main() { 
    Lock(&c.m); // Constructs and destroys a temporary lock. 
} 
+0

पहले उदाहरण के लिए, यह बहुत भ्रमित है कि अगर std :: mutex मुख्य रूप से अंदर है तो संकलित नहीं होता है, लेकिन अगर mutex बाहर है तो यह करता है। क्या आप इस बारे में विस्तार से बता सकते हैं कि किस प्रकार का पैटर्न समस्याग्रस्त है? –

+0

@ थॉमसमाउलार्ड 'std :: unique_lock (एम);' 'std :: unique_lock मीटर के बराबर है, क्योंकि इसे घोषणा के रूप में विश्लेषित किया गया है। यह अब स्पष्ट होना चाहिए कि म्यूटेक्स 'मुख्य' के अंदर क्यों है, यह संकलित नहीं होता है। –

+0

ठीक है अब मैं बेवकूफ महसूस करता हूं;) धन्यवाद! –

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