Masalah Pengoptimuman Program Multithreading
Dalam kod anda, anda mempunyai atur cara berbilang thread di mana benang berasingan menambah pembilang sementara urutan utama menunggu satu saat dan kemudian menetapkan bendera untuk menandakan benang kaunter berhenti. Walau bagaimanapun, apabila berjalan dalam mod yang dioptimumkan (-O1 -O3), program akan tersekat tanpa mencetak sebarang output.
The Culprit: Non-Atomic Variable Access
The isu timbul daripada pembolehubah "selesai", iaitu bool ringkas yang diakses serentak oleh berbilang benang tanpa sebarang penyegerakan atau atomicity jaminan. Apabila diakses secara serentak, pembolehubah ini boleh membawa kepada tingkah laku tidak ditentukan (UB).
Penyelesaian: Gunakan std::atomic
Untuk menangani perkara ini, pembolehubah "selesai" harus diisytiharkan sebagai jenis atom, seperti std::atomic
Kod Disemak:
#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>
Penjelasan:
Dalam kod yang disemak, pembolehubah "selesai" diisytiharkan sebagai std::atomic
Nota Mengenai Pengoptimuman
Dalam mod dioptimumkan, pengkompil mungkin melakukan pengoptimuman agresif yang boleh menyebabkan masalah jika data tidak disegerakkan dengan betul. Dengan menggunakan std::atomic, anda secara eksplisit mengarahkan pengkompil untuk mengekalkan atomicity pembolehubah "selesai", walaupun dalam binaan yang dioptimumkan.
Atas ialah kandungan terperinci Mengapa Program Berbilang Benang Dioptimumkan Saya Membeku Apabila Menggunakan Bendera Boolean Bukan Atom?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!