कुछ लोगों को चेतावनी दे रहे हैं कि ताले का उपयोग गलत है लेखन से हो सकता है:क्या सी ++ में अस्थायी चर को तुरंत चालू करना संभव है?
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.
किसी एक रेप्रो मामले में जहां इस तरह के एक मैक्रो कोई वास्तविक बग पकड़ प्रदर्शन कर सकता है? मैं अब तक एक साथ नहीं आ सकता था।
संभवतः संबंधित: http://stackoverflow.com/questions/914861/disallowing-creation-of-the - समकालीन वस्तुएं – BenC