Scheff का उत्तर बताता है कि आपके कोड को कैसे ठीक किया जाए। मैंने सोचा कि इस मामले में वास्तव में क्या हो रहा है, इस पर मैं थोड़ी जानकारी जोड़ूंगा।
मैंने अनुकूलन स्तर 1 ( ) का उपयोग करके आपके कोड को गॉडबॉल्ट में संकलित किया -O1
। आपका फ़ंक्शन इस तरह संकलित करता है:
func():
cmp BYTE PTR finished[rip], 0
jne .L4
.L5:
jmp .L5
.L4:
mov eax, 0
ret
तो, यहाँ क्या हो रहा है? सबसे पहले, हमारे पास एक तुलना है: cmp BYTE PTR finished[rip], 0
- यह देखने के लिए कि क्या हैfinished
क्या झूठा है या नहीं ।
यदि यह गलत नहीं है (उर्फ सच) हमें पहले रन पर लूप से बाहर निकलना चाहिए। इस के द्वारा पूरा किया jne .L4
जो जे umps जब n OT ई लेबल से qual .L4
जहां का मूल्य i
(0
) बाद में उपयोग और समारोह रिटर्न के लिए एक रजिस्टर में संग्रहित है।
यदि यह है तथापि झूठी है, हम करने के लिए ले जाने के
.L5:
jmp .L5
यह एक बिना शर्त कूद है, लेबल करने के लिए .L5
जो सिर्फ इतना ही होता है कि जंप कमांड खुद हो।
दूसरे शब्दों में, धागे को एक अनंत व्यस्त लूप में डाल दिया जाता है।
तो ऐसा क्यों हुआ है?
जहां तक आशावादी का सवाल है, धागे इसके दायरे से बाहर हैं। यह मानता है कि अन्य थ्रेड्स एक साथ चर या पढ़ना नहीं लिख रहे हैं (क्योंकि यह डेटा-रेस यूबी होगा)। आपको यह बताने की आवश्यकता है कि यह एक्सेस को ऑप्टिमाइज़ नहीं कर सकता है। यह वह जगह है जहाँ शेफ़ का जवाब आता है। मैं उसे दोहराने की जहमत नहीं उठाऊँगा।
क्योंकि ऑप्टिमाइज़र को यह नहीं बताया जाता है कि finished
फ़ंक्शन के निष्पादन के दौरान चर संभावित रूप से बदल सकता है, यह देखता है कि finished
फ़ंक्शन द्वारा ही संशोधित नहीं किया गया है और मानता है कि यह निरंतर है।
अनुकूलित कोड दो कोड पथ प्रदान करता है जो एक निरंतर बूल मान के साथ फ़ंक्शन में प्रवेश करने का परिणाम देगा; या तो यह लूप को असीम रूप से चलाता है, या लूप को कभी नहीं चलाया जाता है।
पर -O0
संकलक (उम्मीद के रूप में) पाश शरीर और तुलना दूर अनुकूलन नहीं करता:
func():
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], 0
.L148:
movzx eax, BYTE PTR finished[rip]
test al, al
jne .L147
add QWORD PTR [rbp-8], 1
jmp .L148
.L147:
mov rax, QWORD PTR [rbp-8]
pop rbp
ret
इसलिए फ़ंक्शन, जब अयोग्यता काम करती है, तो यहां एटमॉसिटी की कमी आमतौर पर एक समस्या नहीं है, क्योंकि कोड और डेटा-प्रकार सरल है। संभवत: सबसे खराब हम यहां दौड़ सकते हैं, इसका एक मूल्य i
यह है कि यह क्या होना चाहिए।
डेटा-संरचनाओं के साथ एक अधिक जटिल प्रणाली के परिणामस्वरूप दूषित डेटा, या अनुचित निष्पादन की संभावना अधिक होती है।