Rumah >pembangunan bahagian belakang >C++ >Mengapa Program Berbilang Benang Saya Berhenti dalam Mod Dioptimumkan Tetapi Berfungsi dalam -O0?

Mengapa Program Berbilang Benang Saya Berhenti dalam Mod Dioptimumkan Tetapi Berfungsi dalam -O0?

Patricia Arquette
Patricia Arquetteasal
2024-12-29 22:02:30675semak imbas

Why Does My Multithreaded Program Stall in Optimized Mode But Work in -O0?

Program Multithreading Berhenti dalam Mod Dioptimumkan tetapi Berjalan Biasa dalam -O0

Isu ini timbul daripada program multithreading di mana pembolehubah kongsi bukan atom. Khususnya, masalahnya terletak pada pembolehubah boolean selesai yang diakses oleh dua utas tanpa sebarang penyegerakan atau atomicity.

Dalam mod yang dioptimumkan, pengkompil menganggap pembolehubah kongsi yang diakses oleh berbilang utas dilindungi. Walau bagaimanapun, dalam program ini, selesai diisytiharkan sebagai bool biasa, menjadikannya bukan atom. Ini membolehkan pengkompil mengoptimumkan mekanisme penyegerakan yang penting untuk operasi berbilang benang.

Untuk menyelesaikan isu ini, selesai hendaklah diisytiharkan sebagai std::atomic. Jenis ini menyediakan operasi baca dan tulis atom, memastikan akses serentak kepada pembolehubah kekal jelas dan konsisten.

Kod Tetap:

#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>

Demo Langsung: coliru

Pertimbangan Tambahan:

  • Pembolehubah meruap sahaja tidak dapat menjamin atomicity. Walaupun ia menghalang pengkompil daripada mengoptimumkan operasi baca/tulis, ia tidak menyediakan halangan memori atau primitif penyegerakan.
  • Penyusun moden sangat agresif dalam pengoptimuman. Adalah penting untuk menunjukkan secara eksplisit kawasan memori yang dikongsi dan keperluan penyegerakan sumber untuk mengelakkan tingkah laku yang tidak dijangka.

Atas ialah kandungan terperinci Mengapa Program Berbilang Benang Saya Berhenti dalam Mod Dioptimumkan Tetapi Berfungsi dalam -O0?. 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