Mengapa Program Multithreading Terperangkap dalam Mod Dioptimumkan?
Artikel ini meneroka isu yang biasa dihadapi dalam program multithreading, di mana program tersekat dalam mod yang dioptimumkan (- O1, -O2, -O3) tetapi berkelakuan seperti biasa dalam mod tidak dioptimumkan (-O0).
Pertimbangkan program berbilang benang berikut yang ditulis dalam C :
static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result = std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished = true; std::cout << "result =" << result.get(); std::cout << "\nmain thread>
Apabila menjalankan program ini dalam mod nyahpepijat (tidak dioptimumkan) atau dengan bendera -O0 GCC, ia biasanya berkelakuan sebagai dijangka dan mencetak hasilnya selepas 1 saat. Walau bagaimanapun, apabila disusun dalam mod keluaran atau dengan tahap pengoptimuman yang lebih tinggi (-O1, -O2, -O3), program akan tersekat dan tidak mencetak apa-apa.
Isunya terletak pada pembolehubah dikongsi selesai, iaitu bukan atom dan tidak terjaga. Pengkompil pengoptimuman menyusun semula arahan capaian memori, menyebabkan berbilang benang mengakses pembolehubah ini secara serentak, membawa kepada tingkah laku yang tidak ditentukan. Untuk membetulkannya, kita harus menggunakan pembolehubah atom untuk selesai.
Berikut ialah kod yang diperbetulkan:
#include <iostream> #include <future> #include <atomic> static std::atomic<bool> finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result = std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished = true; std::cout << "result =" << result.get(); std::cout << "\nmain thread>
Dengan pembetulan ini, atur cara akan berfungsi dengan betul walaupun dalam mod yang dioptimumkan. Ia menunjukkan kepentingan menggunakan pembolehubah atom dalam program berbilang benang untuk mengelakkan perlumbaan data dan tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Mengapa Program Berbilang Benang Membeku Di Bawah Pengoptimuman Pengkompil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!