Rumah > pembangunan bahagian belakang > C++ > Mengapa Program Berbilang Benang Dioptimumkan Saya Terhenti, dan Bagaimana Pembolehubah Atom Boleh Membetulkannya?

Mengapa Program Berbilang Benang Dioptimumkan Saya Terhenti, dan Bagaimana Pembolehubah Atom Boleh Membetulkannya?

Barbara Streisand
Lepaskan: 2024-12-16 02:01:09
asal
501 orang telah melayarinya

Why Does My Optimized Multithreaded Program Stall, and How Can Atomic Variables Fix It?

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>
Salin selepas log masuk

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:

static std::atomic<bool> finished = false;
Salin selepas log masuk

Ini menyelesaikan isu dan membolehkan program berjalan dengan jayanya dalam mod yang dioptimumkan, memaparkan output yang diingini:

result = 1023045342
main thread>
Salin selepas log masuk

Kepentingan std::atomic

Pembolehubah atom, seperti std::atomic, memastikan akses serentak dan pengubahsuaian data dikongsi dengan cara yang jelas dan selamat untuk benang. Mereka melarang tingkah laku yang tidak dijangka seperti mengoyak dan melindungi daripada pengoptimuman pengkompil yang mungkin secara tidak sengaja mengubah aliran program yang betul.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan