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
Barbara Streisandasal
2024-12-16 02:01:09506semak imbas

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>

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;

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

result = 1023045342
main thread>

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!

Kenyataan:
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