Program Multithreading Berhenti dalam Mod Dioptimumkan tetapi Berjalan Biasa dalam -O0
Isu ini timbul daripada program multithreading di mana pembolehubah kongsi bukan atom. Khususnya, masalahnya terletak pada pembolehubah boolean selesai yang diakses oleh dua utas tanpa sebarang penyegerakan atau atomicity.
Dalam mod yang dioptimumkan, pengkompil menganggap pembolehubah kongsi yang diakses oleh berbilang utas dilindungi. Walau bagaimanapun, dalam program ini, selesai diisytiharkan sebagai bool biasa, menjadikannya bukan atom. Ini membolehkan pengkompil mengoptimumkan mekanisme penyegerakan yang penting untuk operasi berbilang benang.
Untuk menyelesaikan isu ini, selesai hendaklah diisytiharkan sebagai std::atomic
Kod Tetap:
#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>
Demo Langsung: coliru
Pertimbangan Tambahan:
Atas ialah kandungan terperinci Mengapa Program Berbilang Benang Saya Berhenti dalam Mod Dioptimumkan Tetapi Berfungsi dalam -O0?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!