Program Multithreading Dioptimumkan Terhenti dalam Mod Dioptimumkan: Resolusi melalui Pembolehubah Atom
Pertimbangkan program multithreading berikut:
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>
Program ini beroperasi seperti yang dijangkakan dalam mod nyahpepijat atau dengan pengoptimuman -O0 bendera. Walau bagaimanapun, apabila dilaksanakan dalam mod keluaran atau dengan bendera pengoptimuman -O1, -O2 atau -O3, ia menghadapi isu dan gagal memberikan sebarang output.
Punca dan Penyelesaian
Punca masalah terletak pada akses serentak kepada pembolehubah bukan atom dan tidak dikawal yang diselesaikan oleh berbilang benang. Pembolehubah ini tidak menjamin atomicity, membawa kepada tingkah laku yang tidak ditentukan. Untuk membetulkannya, selesai hendaklah ditakrifkan sebagai std::atomic Ini menyelesaikan isu dan membolehkan program berjalan dengan jayanya dalam mod yang dioptimumkan, memaparkan output yang diingini: Kepentingan std::atomic Pembolehubah atom, seperti std::atomic Pertimbangan Tambahan Sambil menggunakan pembolehubah atom meningkatkan keselamatan serentak dengan ketara, adalah penting untuk menyedari bahawa pengoptimuman boleh membawa akibat yang meluas. Sebagai contoh, pengkompil mungkin mengoptimumkan pembolehubah tidak dilindungi ke dalam daftar atau menghapuskan akses berlebihan untuk meningkatkan prestasi. Untuk mengelakkan pengoptimuman yang tidak diingini, perlindungan pembolehubah yang betul dan arahan eksplisit kepada pengkompil adalah penting. Atas ialah kandungan terperinci Mengapa Program Berbilang Benang Dioptimumkan Saya Terhenti, dan Bagaimana Pembolehubah Atom Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!static std::atomic<bool> finished = false;
result = 1023045342
main thread>