শেফের উত্তর আপনার কোড ঠিক করতে কীভাবে বর্ণনা করে। আমি ভেবেছিলাম এই ক্ষেত্রে আসলে কী ঘটছে সে সম্পর্কে আমি একটু তথ্য যুক্ত করব।
আমি আপনার কোডটি অপ্টিমাইজেশন স্তর 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 যখন এন OT ই লেবেলে গণদেবতা .L4
যেখানে মান i
( 0
) পরে ব্যবহার করার এবং ফাংশন আয় জন্য একটি রেজিস্টার সংরক্ষণ করা হয়।
যদি হয় তবে মিথ্যা, আমরা সরাতে
.L5:
jmp .L5
এটি একটি নিঃশর্ত জাম্প, লেবেল করা .L5
যা ঠিক তাই লাফ কমান্ড নিজেই ঘটে।
অন্য কথায়, থ্রেডটি অসীম ব্যস্ত লুপে রাখা হয়েছে।
তাহলে কেন এমন হয়েছে?
অপ্টিমাইজারের দিক থেকে থ্রেডগুলি এর পরিদর্শনের বাইরে। এটি ধরে নিয়েছে যে অন্যান্য থ্রেডগুলি একই সাথে ভেরিয়েবলগুলি পড়ছে না বা লেখছে না (কারণ এটি ডেটা-রেস ইউবি হবে)। আপনাকে এটি বলতে হবে যে এটি অ্যাক্সেসগুলি দূরে সরিয়ে নিতে পারে না। এখানেই শেফের উত্তর আসে I আমি তাকে পুনরাবৃত্তি করতে বিরক্ত করব না।
কারণ অপ্টিমাইজারকে বলা হয় না যে 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
যা হওয়া উচিত তা একে একে বন্ধ ।
ডেটা-স্ট্রাকচার সহ আরও জটিল সিস্টেমের ফলে দূষিত ডেটা বা ভুল প্রয়োগের ফলস্বরূপ অনেক বেশি সম্ভাবনা রয়েছে।