Rumah > pembangunan bahagian belakang > C++ > Mengapa Program Berbilang Benang Membeku Di Bawah Pengoptimuman Pengkompil?

Mengapa Program Berbilang Benang Membeku Di Bawah Pengoptimuman Pengkompil?

Linda Hamilton
Lepaskan: 2024-12-13 16:31:15
asal
874 orang telah melayarinya

Why Do Multithreaded Programs Freeze Under Compiler Optimization?

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

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

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!

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