/ / कैसे संकलक जानता है कि लॉक / अनलॉक के अंदर से बयानों का अनुकूलन नहीं करना है? बूस्ट का उपयोग :: c + + c ++ में स्पिनलॉक, मल्टीथ्रेडिंग, बूस्ट, लॉकिंग, तुलना-और-स्वैप

कंपाइलर कैसे अंदर ताला / अनलॉक से बयान अनुकूलित करने के लिए नहीं जानता है? बूस्ट :: स्पिनलॉक्स सी ++ में - सी ++, मल्टीथ्रेडिंग, बूस्ट, लॉकिंग, तुलना-एंड-स्वैप

दो अतिभारित वर्ग operator() कार्यों को अलग-अलग थ्रेड्स से कहा जाता है। नीचे दिए गए कोड में देखें // टिप्पणियाँ।

क्या आशावादी को स्थानांतरित करने के लिए नहीं पता है entryadd = mSpread * ENTRY_MULTIPLIER इसके ऊपर lock()?

struct Algo1
{
boost::detail::spinlock mSpreadLock;

Algo1() : mSpreadLock() {}

//called from thread 1
inline void operator()(const indata &signal)
{
if ( signal.action() == SEND )
{
double entryadd;
mSpreadLock.lock();
entryadd = mSpread * ENTRY_MULTIPLIER; //isnt it possible for compiler to optimize this before the lock?
mSpreadLock.unlock();
FunctionCall(entryadd);
}
}

//called from thread2
inline void operator()(const indata2 &bospread)
{
boost::detail::spinlock::scoped_lock mylock(mSpreadLock);
mSpread = bospread.spread();
}
}

इस बारे में क्या?

{
mSpreadLock.lock();
double entryadd = mSpread * ENTRY_MULTIPLIER;
mSpreadLock.unlock();
{

की परिभाषा होगी entryadd मुझे समारोह के शीर्ष पर ले जाया गया?

जब तक कुछ याद नहीं आ रहा .. लगता है कि एक कोड ब्लॉक के भीतर ताला और अनलॉक काम नहीं करेगा scoped_lock का उपयोग करना चाहिए। boost::detail::spinlock::scoped_lock mylock(mSpreadLock) , जो फ़ंक्शन कॉल की अवधि के लिए लॉक हो जाएगा।

बेशक मैं इसे इस तरह से हैक कर सकता हूं:

inline void operator()(const indata &signal)
{
if ( signal.action() == SEND )
{
double entryadd;
{
boost::detail::spinlock::scoped_lock mylock(mSpreadLock);
entryadd = mSpread * ENTRY_MULTIPLIER;
}
FunctionCall(entryadd);
}
}

उत्तर:

जवाब के लिए 3 № 1

लॉकिंग ऑपरेशन अंततः कंपाइलर का उपयोग करेगाअंतर्निहित कार्य जो कुछ प्रकार के परमाणु संचालन करते हैं। संकलक जानता है कि उन कार्यों को फिर से शुरू नहीं करना चाहिए और उन्हें "अतीत" का अनुकूलन नहीं करना चाहिए। यह सब ठीक है।